使用mvc在下拉列表中显示列表的正确方法

时间:2015-02-28 20:26:25

标签: asp.net-mvc

我知道这里有很多类似的问题,但似乎没有一个像我的一样。

在我的观点中:

@model LocalInformedMotionServer.Models.FeedData
@Html.DropDownList("Premise", Model.LoadUp("key"), new { @style = "width: 218px;height:35px;" })

在我的控制器中:

public class CloudController  : Controller
{
    public IEnumerable<wsCommon.Premise> Premises { get; set; }
    public ActionResult Feed(string key)
    {
        var feedData = new FeedData();
       Premises= feedData.LoadUp(key);
        return View(feedData);
    }    
}

在我的模型中:

public class FeedData
{
    public IEnumerable<wsCommon.Premise> LoadUp(string saltKey)
    {
        Premises premises = new InformedBiz.Premises();
        return premises.GetPremises(saltKey);
    }
}

错误是因为变量:

   "key" 
在这个电话中

  Model.LoadUp("key")
在我的控制器方法中,

被读作'null'。

当然,因为这对我来说是全新的,所以我可能会做错了。

附加:

在我的CloudController类中,我有这个:

 public class CloudController  : Controller
    {
    public ActionResult Feed(string saltKey)
    {
        var feedData = new FeedData();
        feedData.LoadUp(saltKey); 
        return View(feedData);
    }

    public ActionResult Index()
    {
        return View();
    }
    public ActionResult LogIn()
    {
        return View();
    }
}

2 个答案:

答案 0 :(得分:2)

我不确定您的Premise类是什么样的,但我通常在我的视图中使用一个IEnumberable的SelectListItem来下拉。所以你可以这样做:

public IEnumerable<SelectListItem> LoadUp(string saltKey)
{
    Premises premises = new InformedBiz.Premises();
    return premises.GetPremises(saltKey).Select(
    p => new SelectListItem { Text = p.Name, Value = z.PremiseId.ToString() }
    );
}

您还需要创建一个Post ActionResult方法,该方法接受视图中的模型(FeedData),并将DropDownList控件包装在Html.BeginForm中,以将结果发布到控制器。希望这有点道理。

答案 1 :(得分:1)

您尚未发布FeedData模型的属性,但假设其中包含Premise类型的属性,并且您希望能够从集合中选择Premise,那么使用表示您想要显示/编辑的视图模型是推荐的方法(参考View Model Design And Use In Razor ViewsWhat is ViewModel in MVC?

您查看模型可能看起来像

public class FeedDataVM
{
  .....
  [Display(Name = "Premise")]
  [Required(ErrorMessage = "Please select a Premise")]
  public int? SelectedPremise { get; set; }
  ....
  public SelectList PremiseList { get; set; }
}

并在您的控制器中(不确定saltKey是什么用于?)

public ActionResult Feed(string saltKey)
{
  FeedDataVM model = new FeedDataVM();
  IEnumerable<Premise> premises = // get the collection of premise objects from your repository
  // assuming you want to display the name property of premise, but post back the key property
  model.PremiseList = new SelectList(premises, "key", "name");
  return View(model);
}

查看

@model FeedDataVM
@using(Html.BeginForm())
{
  ....
  @Html.LabelFor(m => m.SelectedPremise)
  @Html.DropDownListFor(m => m.SelectedPremise, Model.PremiseList, "-Please select")
  @Html.ValidationMessageFor(m => m.SelectedPremise)
  ....
  <input type="submit" value="Save" />
}

和POST方法

public ActionResult Feed(FeedDataVM model)
{
  // model.SelectedPremise contains the value of the selected option as defined by the key property of Premise
}

附注:您的FeedData模型包含一种方法,用于检索似乎正在调用其他服务的Premise集合。您应该避免这种类型的设计,这使得调试和单元测试变得困难。您的控制器负责初始化/获取数据模型和查看模型以及填充/映射其属性。

相关问题