Почему список <SelectListItem>становится пустым в записи? - PullRequest
4 голосов
/ 08 сентября 2011

Я пытаюсь показать RadioButtonList в Asp.Net MVC 3.0. Это мой метод расширения:

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Html;
using System.Linq.Expressions;
using System.Text;

public static class HtmlExtensions
{
    public static MvcHtmlString RadioButtonForSelectList<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper,
        Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList)
    {
        StringBuilder stringBuilder = new StringBuilder();
        var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
        if (selectList != null)
        {
            foreach (var item in selectList)
            {
                var id = string.Format("{0}_{1}", metaData.PropertyName, item.Value);
                var label = htmlHelper.Label(id, HttpUtility.HtmlEncode(item.Text));
                var radio = htmlHelper.RadioButtonFor(expression, item.Value, new { id = id });

                stringBuilder.AppendFormat("<div class=\"RadioButton\">{0}{1}</div>",radio.ToHtmlString(),label.ToHtmlString());
            }
        }
        return new MvcHtmlString(stringBuilder.ToString());
    }
}

Это мои методы действий HomeController:

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

private IndexViewModel GetIndexViewModel()
{
    List<SelectListItem> list = new List<SelectListItem> 
    {
        new SelectListItem{ Selected = true, Value = "1", Text = "Sunday" },
        new SelectListItem{ Selected = false, Value = "2", Text = "Monday" },
        new SelectListItem{ Selected = false, Value = "3", Text = "Tuesday" },
        new SelectListItem{ Selected = false, Value = "4", Text = "Wednesday" },
        new SelectListItem{ Selected = false, Value = "5", Text = "Thursday" },
        new SelectListItem{ Selected = false, Value = "6", Text = "Friday" },
        new SelectListItem{ Selected = false, Value = "7", Text = "Saturday" },
    };
    return new IndexViewModel { SelectLists = list, SelectedItem = list[0] };
}

[HttpPost]
public ActionResult Index(IndexViewModel indexViewModel)
{
    return View(GetIndexViewModel()); //this works

    return View(indexViewModel); //why this doesn't work??
}

Это мой index.cshtml:

@model IndexViewModel    

@using (Html.BeginForm())
{
    <h2>Select any one item</h2>

    @Html.RadioButtonForSelectList(model => model.SelectedItem.Value, Model.SelectLists)

    <br />

    <input type="submit" value="Submit" />
}

Я прокомментировал, какой из них работает, а какой нет. В основном мой список становится нулевым. Что я делаю неправильно? Если мне придется делать это каждый раз, тогда лучше использовать веб-формы, потому что веб-формы могут сохранять данные в обратных передачах. Использование MVC в основном означает, что я должен делать вызов базы данных каждый раз, когда значение публикуется. Я прав или в моем коде есть какая-то ошибка?

1 Ответ

7 голосов
/ 08 сентября 2011

Поскольку вы привязаны к чему-либо в действии GET, это вовсе не означает, что оно будет привязано к тому же свойству в действии POST.Связыватель модели по умолчанию связывает только то, что он видит в Запросе.Поэтому, если эта информация не будет отправлена ​​на сервер при публикации, она будет потеряна.

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

При этом ваш помощник выглядит правильно, и в вашем действии POST вы должны просто повторно получить эту информацию из хранилища данных, которое вы загрузили изначально, если вы хотите повторно отобразить то же представление.Поэтому правильный способ сделать это заключается в следующем:

[HttpPost]
public ActionResult Index(IndexViewModel IndexViewModel)
{
    return View(GetIndexViewModel());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...