2013-03-12 59 views
0

好的,我有一个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();" 
}) 

如何去修复我的代码?

回答

1

如果你的操作方法的参数名字是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),以获得正确的路径。

+0

谢谢老兄,我对MVC很认真,并且还是一名学生,但这种做事方式显然要好得多,礼仪和编程实践。我不确定在创建下拉列表时(视频中的倒数第二部分),我无法理解视图中发生了什么? – 2013-03-12 14:46:11

+0

@ barnacle.m:DropDownListFor帮助器方法将在视图中呈现下拉菜单。反正欢迎来到ASP.NET MVC的精彩世界:) – Shyju 2013-03-12 14:49:32

+0

哈哈谢谢。公共ActionResult创建(),是在我的控制器类? – 2013-03-12 18:46:05

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(); 
} 
相关问题