我有一个带有几个下拉列表的Razor视图。如果其中一个下拉列表的值发生了变化,我想清除另一个下拉列表中的值并将新值放入。我输入的值取决于视图使用的模型中的值,这就是我需要的原因将模型从视图发送回控制器。然后,控制器还需要能够通过向视图发回数据来修改下拉列表。请注意,我并不是说我想从使用Ajax的表单提交回到控制器。我将使用表单提交返回控制器,但不使用Ajax。
请有人给我一些简单的代码或一些指示,说明如何做到这一点。
由于
答案 0 :(得分:3)
我个人使用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,那么您从编译器获得的所有帮助都将被禁用,并且运行时错误/错误的发生可能性超过该属性位于“普通”对象上并且错别字将被捕获编译器。
答案 1 :(得分:3)
我会实现DragonZelda的不同解决方案。
我会创建一个ViewModel对象,其中包含View所绑定的页面所需的数据。
然后,我将创建绑定到该模型的控件,如:
@Html.DropDownListFor(x => x.SomeDDLSelected, ......)
x.SomeDDLSelected将是ViewModel对象中的一个属性,当自动模型绑定器开始运行时,该属性将自动获取下拉列表中的选定值。
然后,为了最终确定它,Controller动作将接收您的ViewModel对象作为参数:
public ActionResult MyAction(MyViewModelObject obj)
{...}
你可以获得所有数据的整洁,所有的强力打字。