如何将数据传递到mvc asp.net中的视图?

时间:2010-11-03 14:03:55

标签: asp.net-mvc asp.net-mvc-3

让我先问问题。

调用加载要在视图上显示的值列表的函数的正确位置在哪里?

我创建了一个像这样的控制器

public ActionResult Create()
{
    SeaModel newSea = new SeaModel();

    return View("Season/CreateSea", newSea);
}

//I not quite sure if this should go here or in another place
partial class seaDataContext
{
    public List<string> getSeaSettings()
    {
        var seaSettings = from p in settings
                          where p.setting == "periods"
                          select p.value;

        return seaSettings.ToList<string>();                              
    }
}

模型就像

public class SeaModel
{
    [Required(ErrorMessage="*")]
    [Display(Name = "Period Name")]
    public string periods { get; set; }    
}

创建像

这样的视图
  @using (Html.BeginForm()) {
        @Html.ValidationSummary(true, "Please correct the following errors.")

        <fieldset>
            <legend>Fields</legend>

            <div class="editor-label">
                @Html.LabelFor(model => model.periods)
            </div>
            <div class="editor-field">
                @Html.Select(model => model.periods, ****My doubt comes here****)
                @Html.ValidationMessageFor(model => model.periods)
            </div>

            <p>
                <input type="submit" value="Create" />
            </p>
        </fieldset>

    }

那么,我如何以及在何处将getSeaSettings()的返回传递给视图?

由于

3 个答案:

答案 0 :(得分:4)

最佳做法是在模型中为此下拉列表创建一个选择列表。

但是您也可以使用更简单的选项:使用ViewData

 public ActionResult Create()
 {
     SeaModel newSea = new SeaModel();

     ViewData["myDropDown"] = new SelectList(listOfObjects, "valueOfTheObjectLikeID", "NameYouWantToShowInDropdown");

     return View("Season/CreateSea", newSea);
 }

然后:

@Html.Select(model => model.periods, ViewData["myDropDown"] as SelectList)

如果您的验证失败,请不要忘记在您的[HttpPost]方法中也填写viewdata,因此可以重建下拉列表。

答案 1 :(得分:2)

您需要查看存储库模式。在asp.net网站上看​​看这个教程 http://www.asp.net/mvc/tutorials/creating-model-classes-with-linq-to-sql-cs

答案 2 :(得分:2)

Stefanvds 的方法就像我以前那样 但我发现使用 additionalViewData 有更好的方式

使用此EditorFor HTML Helper扩展方法。
http://msdn.microsoft.com/en-us/library/ff406462.aspx

您可以在查看中执行此操作,而不是将选择列表项传递到控制器中的 ViewData

将您的列表项作为additionalViewData参数的匿名对象传递 重要的是使用同名作为您的物业名称。

@Html.EditorFor(
    m => m.MyPropertyName,
    new { MyPropertyName = Model.ListItemsForMyPropertyName }
);


当然,您传递的是View Model对象。

public class MyViewModel
{
    public int MyPropertyName;

    public IList<SelectListItem> ListItemsForMyPropertyName;
}



EditorFor方法使用您现有的编辑器视图模板 因此,您不需要像使用Html.DropDown()方法那样再次指定CSS类名和HTML属性。

例如,

//------------------------------
// additionalViewData
//------------------------------
@Html.EditorFor(
    m => m.MyPropertyName,
    new { MyPropertyName = Model.ListItemsForMyPropertyName }
)

//------------------------------
//  traditional approach requires to pass your own HTML attributes
//------------------------------
@Html.DropDown(
    "MyPropertyName",
    Model.ListItemsForMyPropertyName,
    new Dictionary<string, object> {
        { "class", "myDropDownCssClass" }
    }
);

//------------------------------
//  DropDownListFor still requires you to pass in your own HTML attributes
//------------------------------
@Html.DropDownListFor(
    m => m.MyPropertyName,
    Model.ListItemsForMyPropertyName,
    new Dictionary<string, object> {
        { "class", "myDropDownCssClass" }
    }
);

这就是我更喜欢additionalViewData方法的原因 因为,呈现的HTML代码完全依赖于编辑器模板。

此外,使用专门的View Models可以使您的代码更清晰,更易于维护。

希望它有所帮助。