MVC3 /剃须刀控制器Ajax调用

MVC3 /剃须刀控制器Ajax调用

问题描述:

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

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

感谢

+0

我需要使用部分视图吗? – 2012-02-08 10:15:41

我个人使用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) 
{...} 

,你会得到所有的数据漂亮,整洁,所有的强类型。