如何将视图数据传递给类型化的控制器对象
本文关键字:类型化 控制器 对象 视图 数据 | 更新日期: 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
。视图模型是一种表示视图中数据的模型,无论是textboxes
、drop down lists
、textareas
、radio buttons
、checkboxes
等。它还可以在视图上显示静态文本。我写了一个关于什么是视图模型的详细答案,如果你有时间,请去阅读:
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
,即Status
和App
,用于上述列表:
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中选定的行。
-
在按钮控件的视图中添加指向javascript函数和传递参数的onclick属性。在这些示例中,将在网格视图上选择一行
<input id="GenerateData" type="button" value="GenerateData" onclick="generateData(App.grdNameOfGridview.getRowsValues({selectedOnly:true}) [0]);" />
-
在视图中,创建一个使用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 },
-
在控制器上,参数将从视图中传递,并存储在SelectedData 上
public ActionResult GenerateData(string SelectedData) { }