MVC3 / Razor到Controller Ajax调用

时间:2012-02-08 09:34:01

标签: ajax asp.net-mvc-3 jquery razor

我有一个带有几个下拉列表的Razor视图。如果其中一个下拉列表的值发生了变化,我想清除另一个下拉列表中的值并将新值放入。我输入的值取决于视图使用的模型中的值,这就是我需要的原因将模型从视图发送回控制器。然后,控制器还需要能够通过向视图发回数据来修改下拉列表。请注意,我并不是说我想从使用Ajax的表单提交回到控制器。我将使用表单提交返回控制器,但不使用Ajax。

请有人给我一些简单的代码或一些指示,说明如何做到这一点。

由于

2 个答案:

答案 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)
{...}

你可以获得所有数据的整洁,所有的强力打字。