Как передать данные для просмотра в mvc asp.net? - PullRequest
2 голосов
/ 03 ноября 2010

позвольте мне сначала задать вопрос.

Где находится правильное место для вызова функции, которая загружает список значений для отображения в представлении?

Я создаю такой контроллер

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 ]

4 голосов
/ 03 ноября 2010

Рекомендуется создать список выбора в вашей модели для этого раскрывающегося списка.

однако вы также можете использовать более простой вариант: использование 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, если ваша проверка не пройдена, поэтому выпадающий список можно восстановить.

2 голосов
/ 04 ноября 2010

Stefanvds подход был то, что я делал раньше.Но я обнаружил, что есть лучший способ использовать additionalViewData.

Используйте этот редактор для метода расширения HTML Helper.http://msdn.microsoft.com/en-us/library/ff406462.aspx

Вместо передачи Выбрать элементы списка в ViewData в Controller , вы делаете это в View .Передайте элементы списка в качестве анонимного объекта для параметра additionalViewData.Важно использовать то же имя , что и ваше имя свойства.

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

Конечно, вы передаете объект View Model.

public class MyViewModel
{
    public int MyPropertyName;

    public IList<SelectListItem> ListItemsForMyPropertyName;
}

EditorFor метод использует ваши существующие шаблоны представления редактора .Таким образом, вам не нужно снова указывать имена классов CSS и атрибуты HTML, как при использовании метода Html.DropDown ().

Например,

//------------------------------
// 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-код полностью полагается на шаблоны редактора.

Кроме того, использование специализированных моделей просмотра делает ваш код чище и проще в обслуживании.

Надеюсь, это поможет.

2 голосов
/ 03 ноября 2010

Вам нужно взглянуть на шаблон хранилища. Посмотрите этот урок на сайте asp.net http://www.asp.net/mvc/tutorials/creating-model-classes-with-linq-to-sql-cs

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...