如何将视图数据传递给类型化的控制器对象

本文关键字:类型化 控制器 对象 视图 数据 | 更新日期: 2025-03-16 13:33:28

我正在从WPF开发转向Asp-MVC,并开始开发Asp-MVC应用程序。到目前为止,我已经设置了我的:

  • 型号

  • 控制器

  • 视图(带有相关字段。)

下一步涉及在Submit按钮单击时将在我的表单中输入的数据发送到控制器。

我知道在WPF中,我可以将控件属性绑定到视图模型中的属性,而且按钮上会有一个点击事件,这在MVC中是看不到的。

这是我对如何在MVC中做到这一点的伪理解,但如果我错了,请纠正我(模型类型为Case):

1.设置按钮点击事件,将表单数据发送到控制器。

2.将数据传递到控制器构造函数并分配给类型化的Case对象。

问题:

如何将提交按钮上的视图值传递给控制器中的键入对象?

代码:

视图-

      <form action="" method="post">
            <div class="form-horizontal">
                <div class="col-lg-6">

                        <!-- SELECT STATUS STATIC-->
                        <div class="form-group">
                            <label class="col-md-3 control-label" for="Current Status">Status</label>
                            <div class="col-md-8">
                                <select id="Status" name="Status" onchange="" class=" form-control">
                                    <option value="Down">Down</option>
                                    <option value="Up">Up</option>
                                </select>
                            </div>
                        </div>

                        <!-- SELECT APP STATIC-->
                        <div class="form-group">
                            <label class="col-md-3 control-label"  for="App">App</label>
                            <div class="col-md-8" >
                                <select id="App" name="App" onchange="" class=" form-control">
                                    <option value="SAP">SAP</option>
                                    <option value="JAP">JAP</option>
                                </select>
                            </div>
                        </div>
                       <asp:Button id="b1" Text="Submit" runat="server" />
                </div>
            </div>
        </form>            <!--

控制器-

public class CaseController : Controller
{

    public ActionResult Index()
    {
        return View();
    }
}

型号-

Public class Case
{
   public string Status { get; set; }
   public string App { get; set; }
}

如何将视图数据传递给类型化的控制器对象

我希望我能很好地理解您的场景?您有一个包含两个下拉列表和一个提交按钮的表单吗?单击"提交"按钮时,是否要提取选定的值?这就是我对它的理解,这也是我试图用例子解释我的答案的方式。

我建议您将view/页面绑定到view model。视图模型是一种表示视图中数据的模型,无论是textboxesdrop down liststextareasradio buttonscheckboxes等。它还可以在视图上显示静态文本。我写了一个关于什么是视图模型的详细答案,如果你有时间,请去阅读:

MVC中的ViewModel是什么?

转到并创建视图模型。它将包含两个列表,这两个列表将代表您的两个下拉列表。每个列表都有一个与其关联的id,它将包含所选下拉列表项的值:

public class CaseViewModel
{
     public int StatusId { get; set; }
     public List<Status> Statuses { get; set; }
     public int AppId { get; set; }
     public List<App> Apps { get; set; }
}

您的domain models,即StatusApp,用于上述列表:

public class Status
{
     public int Id { get; set; }
     public string Name { get; set; }
}
public class App
{
     public int Id { get; set; }
     public string Name { get; set; }
}

既然已经设置好了,下一步就是在控制器的操作方法中填充这些列表。理想情况下,你可以用数据库中的值来填充它,但在你的情况下,我想硬编码这些值是可以的:

public ActionResult Index()
{
     CaseViewModel model = new CaseViewModel();
     model.Statuses = new List<Status>();
     model.Statuses.Add(new Status { Id = 1, Name = "Down" });
     model.Statuses.Add(new Status { Id = 2, Name = "Up" });
     model.Apps = new List<App>();
     model.Apps.Add(new App { Id = 1, Name = "SAP" });
     model.Apps.Add(new App { Id = 2, Name = "JAP" });
     return View(model);
}

一旦填充了两个列表,就可以将视图模型直接传递给视图。视图将接收一个强类型模型,并将对其执行需要执行的操作。在您的情况下,将创建一个带有两个下拉列表和一个提交按钮的表单。为了清楚起见,我省略了您所有的CSS(只需添加即可):

@model WebApplication_Test.Models.CaseViewModel
@using (Html.BeginForm())
{
     <div>
          @Html.DropDownListFor(
               m => m.StatusId,
               new SelectList(Model.Statuses, "Id", "Name", Model.StatusId),
               "-- Select --"
          )
          @Html.ValidationMessageFor(m => m.StatusId)
     </div>
     <div>
          @Html.DropDownListFor(
               m => m.AppId,
               new SelectList(Model.Apps, "Id", "Name", Model.AppId),
               "-- Select --"
          )
          @Html.ValidationMessageFor(m => m.AppId)
     </div>
     <div>
          <button type="submit">Submit</button>
     </div>
}

因此,现在您有两个填充了数据的下拉列表。在每个中选择一个值,然后按提交按钮。您的视图绑定到视图模型,并将在表单提交时保留值。列表中的值不会保留在表单提交中,需要再次填充:

[HttpPost]
public ActionResult Index(CaseViewModel model)
{
     // Check form validation
     if (!ModelState.IsValid)
     {
          // If validation fails, rebind the lists and send the current view model back
          model.Statuses = new List<Status>();
          model.Statuses.Add(new Status { Id = 1, Name = "Down" });
          model.Statuses.Add(new Status { Id = 2, Name = "Up" });
          model.Apps = new List<App>();
          model.Apps.Add(new App { Id = 1, Name = "SAP" });
          model.Apps.Add(new App { Id = 2, Name = "JAP" });
          return View(model);
     }
     // Form validation succeeds, do whatever you need to do here
     return RedirectToAction("Index");
}

我希望这能有所帮助。

在视图中只需以类似的形式添加一个按钮

<button id="b1" Text="Submit"/>

在控制器中添加一个操作方法来处理帖子。

public class CaseController : Controller
{
  [HttpPost]
  public ActionResult Index(Case case)
    { 
      //Do Something
      return View();
    }
    public ActionResult Index()
    {
     return View();
    }
}

您可能还想研究使用Razor和强类型视图。让事情变得简单多了。

另一种方法是使用mvc ajax调用,通过这样做,您还可以将参数从简单参数传递到控制器,再传递到gridview中选定的行。

  1. 在按钮控件的视图中添加指向javascript函数和传递参数的onclick属性。在这些示例中,将在网格视图上选择一行

    <input id="GenerateData" type="button" value="GenerateData" onclick="generateData(App.grdNameOfGridview.getRowsValues({selectedOnly:true}) [0]);" />

  2. 在视图中,创建一个使用ajax调用控制器的javascript函数,注意可以从单击按钮事件传递到将使用ajax调用该控制器的javascript功能的参数。在这个示例中,我使用extjs框架,如果你愿意,你也可以使用jquery以及

    generateData= function (recordData) { var jsonStringContractUnit = JSON.stringify(recordData); Ext.Ajax.request({ url: '../ControllerName/GenerateData', method: 'POST', params: { SelectedContractUnit: jsonStringContractUnit },

  3. 在控制器上,参数将从视图中传递,并存储在SelectedData 上

    public ActionResult GenerateData(string SelectedData) { }