2

让我先问这个问题。

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

我创建一个这样的控制器

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() 的返回值传递给视图?

谢谢

4

3 回答 3

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] 方法中也填写视图数据,以便可以重建下拉列表。

于 2010-11-03T14:13:15.410 回答
2

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

于 2010-11-03T18:12:46.487 回答
2

Stefanvds的方法是我过去常做的。
但我发现有更好的方法使用additionalViewData.

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

您可以在View中执行此操作,而不是将 Select List Items 传递到Controller中的ViewData。 将列表项作为参数的匿名对象传递。 重要的是使用与您的属性名称相同的名称。

additionalViewData

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


当然,您传入的是一个 View Model 对象。

public class MyViewModel
{
    public int MyPropertyName;

    public IList<SelectListItem> ListItemsForMyPropertyName;
}



EditorFor方法使用您现有的 Editor View Templates
因此,您不需要像使用 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 代码完全依赖于编辑器模板。

此外,使用专门的视图模型可以使您的代码更简洁,更易于维护。

希望能帮助到你。

于 2010-11-04T17:36:42.247 回答