TextBoxFor() не генерира маркировка за валидиране

Имам SQL Server 2012, в който имам AWARD таблица с две колони TITLE и MONTH. TITLE е varchar(256) и не може да бъде NULL. MONTH е int и може да бъде NULL.

С VS2012 Ultimate и EF 5.0.0 помощникът TextBoxFor в приложението MVC4 не произвежда валидиране (data-val="required" and data-val-required="required message") за колоната TITLE по-горе, но в същия изглед MONTH получава правилната маркировка за валидиране. Дизайнерът на .edmx показва, че TITLE е NonNullable, НО автоматично генерираният файл AWARD.cs няма атрибута [Required] за колоната TITLE.

Какво мога да опитам?

@model MyProject.Models.AWARD

@{
    ViewBag.Title = "Add Award";
    Layout = "~/Views/Shared/_EditorLayout.cshtml";
}

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Add Award</legend>
        <table>
            <tr>
                <td>
                    @Html.LabelFor(model => model.TITLE)
                </td>
                <td>
                    @Html.TextAreaFor(model => model.TITLE)
                    <br />@Html.ValidationMessageFor(model => model.TITLE)
                </td>
            </tr>
        <tr>
            <td>
                @Html.LabelFor(model => model.MONTH)
            </td>
            <td>@Html.DropDownListFor(model => model.MONTH, new SelectList(MyProject.Models.Helpers.Months, "key","value"), "[Not Selected]")
                <br />@Html.ValidationMessageFor(model => model.MONTH)
            </td>
        </tr>

            <tr>
                <td>
                    <input type="submit" value="Add" />
                </td>
                <td>
                    @Html.ActionLink("Cancel", "Index", null, new { @class = "cancel-button" })</td>
            </tr>
        </table>
    </fieldset>
}

person joym8    schedule 25.01.2013    source източник
comment
Можете ли да публикувате своя изгледен модел?   -  person Ant P    schedule 26.01.2013


Отговори (1)


Всъщност не трябва да обвързвате своите изгледи директно към вашите обекти за картографиране на данни. Трябва да създадете класове на модел на изглед, за да обгърнете данните, които предавате към и от изгледа си, и след това да попълните вашите обекти с данни от контролера.

След това можете да извършите необходимото валидиране на вашия модел на изглед, без да засягате генерираните от вас класове за картографиране.

Модела

public class AwardViewModel
{
    [Required, StringLength(30)]
    public string Title { get; set; }
    ....
}

Преглед

@model AwardViewModel

@using (Html.BeginForm()) {
    @Html.EditorFor(m => m.Title)
    @Html.ValidationMessageFor(m => m.Title)
    ...
}

Контролер

[HttpPost]
public ActionResult Create (AwardViewModel model)
{
    /* Create new AWARD in entity context, populate
       with relevant fields from model and commit. */
}
person Ant P    schedule 25.01.2013
comment
Ant P това е същият отговор, който намерих в различни форуми и от моя малък опит този подход идва със собствен багаж - като липсващи свойства на навигация (релационна база данни) - освен ако не съвпадате с DatabaseModel същото във вашия ViewModel. Дори съм съгласен с вас - но бих искал да разреша проблема: ЗАЩО TextBoxFor не дава валидиращ HTML, но DropDownListFor е - в рамките на същия HTML формуляр. - person joym8; 26.01.2013
comment
Освен това знам, че мога сам да добавя маркирането за валидиране в TextBoxFor и да приключа с него, или да добавя атрибут [Required] във файла AWARD.cs под моето .edmx дърво. Но това за мен е по-скоро хакване. - person joym8; 26.01.2013
comment
поставяне тук за справка: stackoverflow.com/questions/3000812/ - person joym8; 26.01.2013
comment
Много полезна връзка - докато MS не излезе с някакъв вид алтернативен изглед за генериране на код от база данни: visualstudiogallery.msdn.microsoft.com/ - person joym8; 26.01.2013
comment
Не съм сигурен какво имате предвид под липсващи навигационни свойства - това е цялата точка на модела на изглед. Вашият модел на изглед е модел за вашия изглед, а не за вашите обекти с данни. Вие му давате каквато информация е необходима на изгледа и това не е непременно ограничено до информация от един бизнес обект/клас. Всъщност няма съмнение, че споделянето на вашите бизнес обекти директно с вашето мнение е лоша практика - това ще ви отведе директно до проблеми като този, който имате тук. Вашите изгледи не трябва (и наистина не трябва) да знаят за вашия модел на данни. - person Ant P; 27.01.2013
comment
Ant P прав си - съгласен съм. Лошо кодиране от моя страна. Но въпросът ми наистина се основава на предположението, че EF не се интересува дали споделям бизнес обект с изглед или не. Това е моят избор. EF трябва да свърши работата си, за да осигури правилни анотации за Nullable и/или данни. - person joym8; 28.01.2013