MVC3 /剃须刀控制器Ajax调用
问题描述:
我有一个剃刀视图与几个下拉列表。如果其中一个下拉列表的值发生了变化,我想清除另一个下拉列表中的值并将其放入。我放入的值取决于视图使用的模型中的值,这就是为什么我需要将模型从视图发回控制器。然后,控制器还需要能够通过将数据发送回视图来修改下拉菜单。请注意,我并不是说我想从使用Ajax的表单提交回控制器。我使用表单提交返回到控制器,但不使用Ajax。MVC3 /剃须刀控制器Ajax调用
请有人给我一些简单的代码或一些指针,以显示如何做到这一点。
感谢
答
我个人使用ViewBag &的ViewData来解决这种情况。
控制器:
public ActionResult Index()
{
ViewBag.dd1value = default_value;
ViewBag.dd1 = DropDownlist1();
ViewBag.dd2 = DropDownlist2(dd1value);
Return View();
}
查看:
在第一个下拉列表添加一个onchange的JavaScript。
<select onchange="javascript:this.form.submit();">
@foreach (var item in ViewBag.dd1) {
if (ViewBag.dd1value = item.dd1value)
{
<option selected value="@item.dd1value">@item.dd1text</option>
}
else
{
<option value="@item.dd1value">@item.dd1text</option>
}
}
然后,在提交按钮上给它一个名字。
<input type="submit" name="Genereate" value="Generate" />
在控制器中,创建2个ActionResult来接收数据。 对于下拉列表:
[HttpPost]
public ActionResult Index(int dd1value)
{
ViewBag.dd1value = dd1value;
ViewBag.dd1 = DropDownlist1();
ViewBag.dd2 = DropDownlist2(dd1value);
Return View();
}
对于提交按钮:
[HttpPost]
public ActionResult Index(int dd1value, int dd2value, FormCollection collection)
{
ViewBag.dd1value = dd1value;
ViewBag.dd2value = dd2value;
ViewBag.dd1 = DropDownlist1();
ViewBag.dd2 = DropDownlist2(dd1value);
ViewBag.result = Result(dd1value, dd2value);
Return View();
}
如果您不需要按钮:
[HttpPost]
public ActionResult Index(int dd1value, int dd2value)
{
ViewBag.dd1value = dd1value;
ViewBag.dd2value = dd2value;
ViewBag.dd1 = DropDownlist1();
ViewBag.dd2 = DropDownlist2(dd1value);
ViewBag.result = Result(dd1value, dd2value);
Return View();
}
请注意,如果您使用ViewBag/ViewData的,各方面的帮助您从编译器中获得的值将被禁用,并且运行时错误/错误发生的可能性比如果该属性位于“正常”对象上并且编译器会捕获错别字。
答
我会实施与DragonZelda不同的解决方案。
我会创建一个ViewModel对象,其中包含您需要在页面上的视图绑定到的数据。
然后,我会创建一个绑定到该模型来控制,如:
@Html.DropDownListFor(x => x.SomeDDLSelected, ......)
x.SomeDDLSelected将是您的视图模型对象的属性,将在下拉列表自动获得选择的值时,自动模式活页夹起作用。
然后,最后定稿的控制器行动将收到您的视图模型对象作为参数:
public ActionResult MyAction(MyViewModelObject obj)
{...}
,你会得到所有的数据漂亮,整洁,所有的强类型。
我需要使用部分视图吗? – 2012-02-08 10:15:41