从MVC中的razor html视图执行Controller Method?

时间:2013-03-12 12:27:43

标签: asp.net-mvc html5 html-select

好的,我有Html.DropDownList,我希望能够执行控制器方法ActionResult output(string test)并向其发送参数。我已经有类似的东西,但我得到一个未捕获的TypeError:无法设置null消息的属性'action':

@Html.DropDownList(
"revisions", ViewData["revisions"] as SelectList,
new
{
    onchange = "this.form.action = '/Shops/output('test')'; this.form.submit();"
})

如何修复我的代码?

2 个答案:

答案 0 :(得分:1)

@Html.DropDownList(
"revisions", ViewData["revisions"] as SelectList,
new
{
    onchange = "submitForm();"
})

你的Javascript就在这里

function submitForm()
{
        var form = document.forms[0];
        form = '/Shops/output?test=test'; 
        form.submit();
}

答案 1 :(得分:1)

如果您的Action方法的参数名称为id

public ActionResult output(string id)
{
  //do something
}

那么你可以像这样使用你的表格动作网址。(默认路由将负责休息)

/Shops/output/somestringhere.

如果您使用其他名称,请将其用作查询字符串

public ActionResult output(string name)
{
  //do something
}

现在使用您的表单操作网址

/Shops/output?name=somestringhere

关于您的代码的另一个建议是避免使用Viewdata呈现下拉列表。尝试使用强类型视图模型及其用于将数据传输到视图的属性。还尝试从您的视图中移动您的JavaScript并使其不受限制。这样你的视图只能保持干净的标记。

假设您要在文档创建视图中显示“修订”下拉列表,请在viewmodel中添加属性以包含下拉项。

public class DocumentCreateViewModel
{
  //Other properties also here

  public List<SelectListItem> Revisions{ set;get;}
  public int SelectedRevision { set;get;}

  public DocumentCreateViewModel()
  {
    Revisions=new List<SelectListItem>();
  } 
}

并在您的GET操作中,将下拉内容填充到Revisions属性。

public ActionResult Create()
{
  var vm=new DocumentCreateViewModel();
  vm.Revisions=GetRevisionItemsFromSomeWhere(); 

  return View(vm);    
}

在你的强类型视图中,

@model DocumentCreateViewModel

    @using(Html.Beginform())
    {

      @Html.DropDownListFor(x => x.SelectedRevision,
                     new SelectList(Model.Revisions,"Value","Text"), "Select..")

      <input type="submit" />
    }

现在要处理下拉列表更改事件的表单提交,请添加此脚本。

$(function(){

  $("#SelectedRevision").change(function(){
     var _this=$(this);
     var selectedRevision=_this.val();     
     $("form#YourFormIDHere")
                .attr("action","./Shops/output/"+selectedRevision).submit();
  });


});

您可以使用剃刀辅助方法(@Url.Action)来获取正确的路径,而不是将网址硬编码到商店/输出。