Asp.net mvc 在MVC中从razor html视图执行控制器方法?

Asp.net mvc 在MVC中从razor html视图执行控制器方法?,asp.net-mvc,html,html-select,Asp.net Mvc,Html,Html Select,好的,我有一个Html.DropDownList,我希望能够执行一个控制器方法ActionResult输出(字符串测试),并向它发送一个参数。我已经有类似的东西了,但是我得到了一个未捕获的TypeError:无法设置null消息的属性“action”: @Html.DropDownList( "revisions", ViewData["revisions"] as SelectList, new { onchange = "this.form.action = '/Shops/outp

好的,我有一个
Html.DropDownList
,我希望能够执行一个控制器方法
ActionResult输出(字符串测试)
,并向它发送一个参数。我已经有类似的东西了,但是我得到了一个未捕获的TypeError:无法设置null消息的属性“action”:

@Html.DropDownList(
"revisions", ViewData["revisions"] as SelectList,
new
{
    onchange = "this.form.action = '/Shops/output('test')'; this.form.submit();"
})
我如何着手修复我的代码

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

如果操作方法的参数名称为
id

public ActionResult output(string id)
{
  //do something
}
然后您可以像这样使用表单操作url。(默认路由将处理rest)

如果您有不同的名称,请将其用作查询字符串

public ActionResult output(string name)
{
  //do something
}
现在使用您的表单操作url,如

/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>();
  } 
}
在您的强类型视图中

@model DocumentCreateViewModel

    @using(Html.Beginform())
    {

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

      <input type="submit" />
    }

您可以使用razor helper方法(
@url.Action
)来获得正确的路径,而不是将url硬编码为shops/output。

谢谢,伙计,我对MVC还是个新手,还是个学生,但这种方法显然比礼仪和编程实践要好得多。当你创建下拉列表(你文章中最后的第二段)时,我不确定我是否理解视图中发生了什么?@barnacle.m:dropdownlistforhelper方法将在视图中呈现下拉列表。无论如何,欢迎来到ASP.NET MVC的精彩世界:)哈哈,谢谢。public ActionResult Create()是在我的控制器类中吗?您能解释一下为SelectList()设置的参数吗?请查看官方文档
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();
  });


});