2016-01-07 34 views
0

我刚刚开始使用MVC5(来自WebForms),并且dropdownlist绑定给了我一些适合。引用DropDownList从封闭表格中选择值

我想使用GET请求返回页面,使用选定的值参数来工作。我希望我可以在表单中指定路由参数,所以我想引用DDL的SelectedValue。

<p> 
    @using (Html.BeginForm("Index", "Profile", FormMethod.Get, new { id = WHATDOIPUTHERE})) { 
     @Html.AntiForgeryToken() 

     @Html.DropDownList("ApplicationID", new SelectList(ViewBag.ApplicationList, "ApplicationID", "ApplicationName", ViewBag.SelectedApplicationId), new {onchange = "this.form.submit();"}) 
    } 
</p> 

我可以把它用POST形式工作,但需要第二个控制器的方法,所以我结束了

public ActionResult Index(long? id) { 
    ConfigManager config = new ConfigManager(); 

    //handle application. default to the first application returned if none is supplied. 
    ViewBag.ApplicationList = config.GetApplications().ToList(); 

    if (id != null) { 
     ViewBag.SelectedApplicationId = (long)id; 
    } 
    else { 
     ViewBag.SelectedApplicationId = ViewBag.ApplicationList[0].ApplicationID; //just a safe default, if no param provided. 
    } 

    //handle profile list. 
    List<ProfileViewModel> ps = new List<ProfileViewModel>(); 
    ps = (from p in config.GetProfilesByApp((long)ViewBag.SelectedApplicationId) select new ProfileViewModel(p)).ToList(); 

    return View(ps); 
} 

//POST: Profile 
//read the form post result, and recall Index, passing in the ID. 
[HttpPost] 
public ActionResult index(FormCollection collection) { 
    return RedirectToAction("Index", "Profile", new {id = collection["ApplicationId"]}); 
} 

这将是非常好的摆脱POST方法,因为此视图只会列出子实体。

您认为如何?

回答

1

您可以将您的GET操作方法参数名称更新为与您的下拉名称相同。

我也做了一些小的修改,以避免可能的空引用异常。

public ActionResult Index(long? ApplicationID) { 

    var config = new ConfigManager(); 

    var applicationList = config.GetApplications().ToList(); 
    ViewBag.ApplicationList = applicationList ; 

    if (ApplicationID!= null) { 
     ViewBag.SelectedApplicationId = ApplicationID.Value; 
    } 
    else 
    { 
     if(applicationList.Any()) 
     { 
     ViewBag.SelectedApplicationId = applicationList[0].ApplicationID; 
     } 
    } 

    var ps = new List<ProfileViewModel>(); 
    ps = (from p in config.GetProfilesByApp((long)ViewBag.SelectedApplicationId) 
               select new ProfileViewModel(p)).ToList(); 

    return View(ps); 
} 
+1

这是一个很好的解决方案。非常感谢你。 –

+0

不客气!很高兴我能帮上忙 :) – Shyju