Как отобразить свойство модели строкового типа как флажок в ASP.NET MVC - PullRequest
2 голосов
/ 26 августа 2011

Я хочу отображать строковый тип как флажок в представлении MVC, но возвращает его как строковый тип в HTTP-сообщении. Проблема в том, что он возвращает false на HTTP Post. Ниже мой код:

Вид:

  @model List<Car>

        foreach(var car in Model){
       bool isFourWheel = false;
        if(bool.TryParse(car.IsFourWheel, out isFourWheel){
        @Html.CheckBox("IsFourWheel", isFourWheel); //need to be rendered as checkbox, but returns string type on HTTP POST
    }
     }

Модель:

public class Car
    {
        public string IsFourWheel { get; set; } //bad naming, but it can contain any type, include boolean
    }

Контроллер:

 public ActionResult Index()
        {


            var cars = new List<Car>(){ new Car(){IsFourWheel = "true"},new Car(){IsFourWheel = "false"} };
            return View(cars);
        }

        [HttpPost]
        public ActionResult Index(List<Car> cars)  **Problem IsFourWheel is false when true is selected **
        {           
            return View(cars);
        }

Любой идеал был бы очень признателен.

Ответы [ 3 ]

5 голосов
/ 26 августа 2011

Вы можете попробовать указать имя шаблона в вашем помощнике:

@Html.EditorFor(car => car.IsFourWheel, "CheckBox")

И определить шаблон для отображения данных так, как вы хотите, либо в ~/Views/{YourControllerName}/EditorTemplates/CheckBox.cshtml, либо в ~/Views/Shared/EditorTemplates/CheckBox.cshtml.

Вы можете найти целую серию публикаций Брэда Уилсона о шаблонах MVC здесь:

Брэд Уилсон: Шаблоны ASP.NET MVC 2, часть 1: Введение

Это относится к MVC 2, но большинство концепций по-прежнему применимы и к MVC 3 (за исключением синтаксиса Razor).

Обновление:

На самом деле вы, вероятно,Мне не нужен собственный шаблон для этого.Попробуйте вместо этого использовать @Html.CheckBoxFor(car => car.IsFourWheel).

Обновление 2:

Удалите следующий шаблон в ~/Views/Shared/EditorTemplates:

IsFourWheel.cshtml

@functions {
    private bool IsChecked() {
        if (ViewData.Model == null) return false;
        return Convert.ToBoolean(ViewData.Model, System.Globalization.CultureInfo.InvariantCulture);
    }
}

@Html.CheckBox("", IsChecked(), new { @class = "check-box" })

Затем, на ваш взгляд, назовите это так:

@Html.EditorFor(model => model.IsFourWheel, "IsFourWheel")

Я проверил это и связывание работает в сценариях GET и POST.

1 голос
/ 26 августа 2011

Думаю, будет проще, если вы добавите Id к вашей модели.Именно такМодель:

public class Car
{
    public int CarID { get; set; }
    public string IsFourWheel { get; set; }        
}

Вид:

@model IEnumerable<Car>
foreach (var car in Model)
{
    if(car.IsFourWheel == "true"){
        <input type="checkbox" name="carID" value="@car.CarID" checked="checked" />
    }
    else
    {
        <input type="checkbox" name="carID" value="@car.CarID" />
    }
}

Контроллер:

[HttpPost]
public ActionResult Index(List<int> carID)
{
    //handle selected cars here
    return View();
}
1 голос
/ 26 августа 2011

Вы можете изменить свою модель представления следующим образом:

public class Car
    {
        public string IsFourWheel { get; set; }
        public bool IsFourWheelBool { get { return bool.Parse(IsFourWheel); } }
    }

Ваш взгляд будет выглядеть так:

@Html.EditFor(x => x.IsFourWheelBool);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...