ASP.NET MVC 2 - DropDownFor - Принудительно ли пользователь выбирать значение для необнуляемого типа? - PullRequest
1 голос
/ 11 августа 2010

У меня (или я так думаю!) Простая проблема.

Я значительно упросту свою модель, чтобы ускорить это.

У меня есть класс модели, который можно назвать элементом:

public class Item    
{
    [Required(ErrorMessage="Must indicate if product is to be tracked by serial number.")]
    public bool TrackedBySerial { get; set; }
}

У меня есть представление "Добавить", гдеЯ создаю DropDownList следующим образом:

<%= Html.DropDownListFor(model=>model.TrackedBySerial, new SelectList(new List<object> {null,true,false},null),"Select One") %>
<%= Html.ValidationMessageFor(model => model.TrackedBySerial) %>

Моя проблема заключается в том, что, если я не создаю свое логическое значение в модели для типа NULL, я не могу принудительно установить пустое значение по умолчанию.

Если я использую Html.DropDownList () вместо DropDownListFor (), есть ли способ использовать ModelState.IsValid - или мне нужно также смешать собственную проверку в моем контроллере?

Обновление: Итак, я получил нужную функциональность, она была немного более многословна, чем мне бы хотелось.Есть ли лучший способ сделать это?

Контроллер:

  [HttpPost]
    public ActionResult Add(InventoryItem newItem)
    {
        try
        {

            //get the selected form value
            string formVal = Request.Form["TrackBySerial"];

            //convert to true, false, or null
            bool? selectedValue = TryParseNullable.TryParseNullableBool(formVal);

            //if there is no value, add an error
            if (!selectedValue.HasValue)
            {
                ModelState.AddModelError("TrackBySerial", "You must indicate whether or not this part will be tracked by serial number.");
            }
            else
            {//otherwise add it to the model

                newItem.TrackedBySerial = selectedValue.Value;
            }         


            if (ModelState.IsValid)
            {
                //add part into inventory
                newItem.ID = inventory.AddNewProduct(newItem).ToString();

                //log the action
                logger.LogAction(ActionTypes.ProductCatalog, Request.LogonUserIdentity.Name, "Added new product: " + newItem.PartNumber);

                //put into QA queue here?

                //redirect to edit screen to add suppliers
                return RedirectToAction("Edit", new { id = newItem.ID });


            }

            ViewData["TrackBySerial"] = new SelectList(new object[] { true, false },selectedValue);
            return View(newItem);
        }}


 /// <summary>
    /// Form for adding new catalog entries
    /// </summary>
    /// <returns></returns>
    /// GET: /Purchasing/Catalog/Add
    public ActionResult Add()
    {

        InventoryItem newItem = new InventoryItem();



        ViewData["TrackBySerial"] = new SelectList(new object[] { true, false });

        return View(newItem);
    }

просмотр:

    <div class="editor-field">

            <%=Html.DropDownList("TrackBySerial","- Select One- ") %>                
            <%=Html.ValidationMessage("TrackBySerial") %>


            <%= Html.ValidationMessageFor(model => model.TrackedBySerial) %>
        </div>

1 Ответ

2 голосов
/ 13 декабря 2010

Вам нужно написать свой собственный вспомогательный метод ... что-то вроде этого - убедитесь, что он в статическом классе .:

   public static MvcHtmlString BooleanDropdownFor<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel>>expression)
    {
        IList<SelectListItem> items = new IList<SelectListItem>();
        //Insert values for true, false, and blank into this list.


        return htmlHelper.DropDownListFor(
            expression,
            items
            );
    }

Используйте это так:

<%= Html.BooleanDropdownFor(m => m.TrackedBySerial)%>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...