Связывание модели MVD DropDownList - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь получить значение пользовательского SelectList для передачи в контроллер.Параметры моего списка выбора заполняются из таблицы в базе данных:

public class Priority
{
    public Guid Id { get; set; }
    public string Name { get; set; }
}

Моя модель и модель вида выглядит следующим образом:

public class RequestViewModel
{
    public Request Request { get; set; }
    public IEnumerable<Priority> Priorities { get; set; }
}


public class Request
{
    public Guid Id { get; set; }
    public Priority Priority { get; set; }
}

Использование

Html.DropDownListFor(x => x.Request.Priority, new SelectList(Model.Priorities, "Id", "Name", Model.Request.Priority), new { @class = "custom-select" })

DropdownList корректно заполняется текстом и значением.

При редактировании значение раскрывающегося списка в контроллере равно нулю.

public IActionResult Edit(RequestViewModel viewModel)
{
    var priority = viewModel.Request.Priority; // this is null

}

Нужно ли создавать собственный ModelBinder для этого экземпляра?Разве построитель моделей по умолчанию не получит правильный выбранный «Приоритет» из идентификатора, переданного в значении?

Кроме того, лучше ли использовать ViewBag вместо Viewmodel для передачи информации, такой как списки выбора, в представление?

1 Ответ

0 голосов
/ 29 января 2019

ASP.NET MVC Fiddle здесь https://dotnetfiddle.net/PIPf4Z. Тем временем, я надеюсь, что это отвечает на ваши вопросы.

Controller / ViewModel

public class RequestViewModel
{
    public Guid SelectedGuid { get; set; }
    //Text=Name, Value=Guid
    public List<SelectListItem> Priorities { get; set; }
}

public class HomeController : Controller
{
    [HttpPost]
    public ActionResult Tut144(RequestViewModel selected)
    {
        RequestViewModel requestViewModel = GetData();
        return View();
    }

    public ActionResult Tut144()
    {
        RequestViewModel requestViewModel = GetData();

        return View(requestViewModel);
    }

    private static RequestViewModel GetData()
    {
        //prep the vcontroller-you can do this from db
        List<SelectListItem> list = new List<SelectListItem>();
        SelectListItem selectListItemA = new SelectListItem { Text = "Priority1", Value = Guid.NewGuid().ToString() };
        SelectListItem selectListItemB = new SelectListItem { Text = "Priority2", Value = Guid.NewGuid().ToString() };
        SelectListItem selectListItemC = new SelectListItem { Text = "Priority3", Value = Guid.NewGuid().ToString() };
        list.Add(selectListItemA);
        list.Add(selectListItemB);
        list.Add(selectListItemC);
        RequestViewModel requestViewModel = new RequestViewModel { Priorities = list };
        return requestViewModel;
    }

View

@model Testy20161006.Controllers.RequestViewModel
@{
    Layout = null;
}
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Tut144</title>
</head>
<body>
    @using (Html.BeginForm())
    {
    <table>
        <tr>
            <td>Priority:</td>
            <td>
                @Html.DropDownListFor(m => m.SelectedGuid,
                         new SelectList(Model.Priorities, "Value", "Text"))
            </td>
        </tr>
        <tr>
            <td></td>
            <td><input type="submit" value="Go" /></td>
        </tr>
    </table>
    }
</body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...