0

好的,所以我有一个Html.DropDownList并且我希望能够执行一个控制器方法ActionResult output(string test)并向它发送一个参数。我已经有类似的东西了,但是我收到了 Uncaught TypeError: Cannot set property 'action' of null 消息:

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

我该如何修复我的代码?

4

2 回答 2

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

你的 Javacript 在这里

function submitForm()
{
        var form = document.forms[0];
        form = '/Shops/output?test=test'; 
        form.submit();
}
于 2013-03-12T12:31:20.623 回答
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 从您的视图中移开,并使其不显眼。这样您的视图就只能保持干净的标记。

假设您想在文档创建视图中显示修订下拉菜单,请将属性添加到您的视图模型以具有下拉项目。

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();
  });


});

您可以使用 razor helper method( @Url.Action) 来获取正确的路径,而不是将 URL 硬编码到商店/输出。

于 2013-03-12T12:31:22.020 回答