好的,我有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();"
})
如何修复我的代码?
答案 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
)来获取正确的路径,而不是将网址硬编码到商店/输出。