从MVC中的剃刀html视图执行控制器方法?
问题描述:
好的,我有一个Html.DropDownList
,我希望能够执行一个控制器方法ActionResult output(string test)
并发送一个参数给它。我有这样的事情了,不过我得到一个遗漏的类型错误:无法设置属性空消息的“动作”:从MVC中的剃刀html视图执行控制器方法?
@Html.DropDownList(
"revisions", ViewData["revisions"] as SelectList,
new
{
onchange = "this.form.action = '/Shops/output('test')'; this.form.submit();"
})
如何去修复我的代码?
答
如果你的操作方法的参数名字是id
,
public ActionResult output(string id)
{
//do something
}
,那么你可以使用你的表单操作的网址是这样的。(默认路由会照顾好休息)
/Shops/output/somestringhere.
如果你有不同的名称,使用它作为查询字符串
public ActionResult output(string name)
{
//do something
}
现在使用表单操作URL像
/Shops/output?name=somestringhere
另一个建议你的代码是为了避免可视数据用于呈现落下。尝试使用强类型的视图模型,以及将数据传输到视图的属性。也尝试从您的视图中移动您的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();
});
});
代替硬编码的URL到店/输出,你可以使用剃刀助手方法(@Url.Action
),以获得正确的路径。
答
@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();
}
谢谢老兄,我对MVC很认真,并且还是一名学生,但这种做事方式显然要好得多,礼仪和编程实践。我不确定在创建下拉列表时(视频中的倒数第二部分),我无法理解视图中发生了什么? – 2013-03-12 14:46:11
@ barnacle.m:DropDownListFor帮助器方法将在视图中呈现下拉菜单。反正欢迎来到ASP.NET MVC的精彩世界:) – Shyju 2013-03-12 14:49:32
哈哈谢谢。公共ActionResult创建(),是在我的控制器类? – 2013-03-12 18:46:05