Проверка клиента и сервера MVC 2 с аннотациями данных - обязательно не работает - PullRequest
0 голосов
/ 23 сентября 2010

У меня есть представление Create, которому передается ViewModel. ViewModel содержит следующее:

namespace MyProject.ViewModels
{
    public class MyObjectCreateView
    {
        public MyObject MyObject { get; set; }
        public List<OtherObject> OtherObjects { get; set; }
    }
}

Объекты создаются с использованием Entity Framework. У меня есть частичный класс метаданных для MyObject:

[MetadataType(typeof(MyObjectMetaData))]
public partial class MyObject
{
    // Validation rules for the MyObject class

    public class MyObjectMetaData
    {
        // Validation rules for MyObjectId
        [DisplayName("MyObject")]
        [Required(ErrorMessage = "Please enter the MyObject ID number.")]
        [DisplayFormat( ApplyFormatInEditMode=true,
                                ConvertEmptyStringToNull=true,
                                HtmlEncode=true)]
        [DataType(DataType.Text)]
        [StringLength(25, ErrorMessage = "Must be under 25 characters.")]
        public object MyObjectId { get; set; }


        // Validation rules for Title
        [Required(ErrorMessage = "Please enter the Title for MyObject.")]
        [DataType(DataType.MultilineText)]
        [StringLength(200, ErrorMessage = "Must be under 200 characters.")]
        [DisplayFormat(ApplyFormatInEditMode = true,
                                ConvertEmptyStringToNull = true,
                                HtmlEncode = true)]
        public object Title { get; set; }

Etc ...

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

<% Html.EnableClientValidation(); %>

<% using (Html.BeginForm()) {%>

    <%:Html.ValidationSummary(true, "Please fix the following errors:") %>
    <%:Html.EditorFor(model => model.MyObject) %>

    <p>
        <input type="submit" value="Save" />
    </p>

    <% } %>

<div>
    <%:Html.ActionLink("Back to List", "Index") %>
</div>

Наконец, редактор для MyObject:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<TxRP.Models.MyObject>" %>
<%--EditorTemplate--%>

<fieldset>
    <div class="editor-label"><%:Html.LabelFor(model => model.MyObjectId)%></div>
    <div class="editor-field">
        <%:Html.TextBoxFor(model => model.MyObjectId)%>
        <%= Html.ValidationMessageFor(model => model.MyObjectId) %>
    </div>           

    <div class="editor-label"><%:Html.LabelFor(model => model.Title)%></div>
    <div class="editor-field">
        <%:Html.TextAreaFor(model => model.Title, new { cols = "80" })%>
        <%= Html.ValidationMessageFor(model => model.Title)%>
    </div>

У меня установлена ​​проверка клиента, и все сценарии находятся на главной странице:

<script src="../../Scripts/MicrosoftMvcAjax.js" type="text/javascript"></script>
<script src="../../Scripts/MicrosoftMvcValidation.js" type="text/javascript"></script>
<script src="../../Scripts/MicrosoftMvcJQueryValidation.js" type="text/javascript"></script>
<script src="../../scripts/jquery-1.4.1.min.js" type="text/javascript"></script>  
<script src="../../Scripts/ui/minified/jquery.ui.core.min.js" type="text/javascript"></script>  
<script src="../../Scripts/ui/minified/jquery.ui.datepicker.min.js" type="text/javascript"></script>  

<link href="../../Content/Site.css" type="text/css" rel="Stylesheet" />  
<link href="../../Content/jquery-ui/sunny/jquery-ui-1.8.4.custom.css" type="text/css" rel="Stylesheet" /> 

Когда я нажимаю кнопку Сохранить, проверка не происходит. Нет проверки клиента, нет проверки сервера (кажется, что даже не выполняется действие Post create!); это просто бомбы в модели структуры сущностей с ConstraintException, потому что Title имеет значение null. Argh!

Я уверен, что это просто какая-то глупая вещь, которую я упустил, но я знаю, что в какой-то момент это работало, а сейчас - нет, и я пытался выяснить это всю неделю. Спасибо за любую помощь, я раздуваю мозолистый лоб от удара по столу!

РЕДАКТИРОВАТЬ: Вот контроллер:

public ActionResult Create(MyObject myObject)
{
    if (!ModelState.IsValid) 
    {
        //ModelState is invalid
        return View(new MyObject());
    }
    try
    {
        //TODO: Save MyObject

        return RedirectToAction("Index");
    }
    catch
    {
        //Invalid - redisplay with errors

        return View(new MyObject());
    }           
}

и трассировка стека исключений:

at System.Data.Objects.DataClasses.StructuralObject.SetValidValue(String value, Boolean isNullable)
   at MyProject.Models.MyObject.set_Title(String value) in C:\CodeProjects\MyProject\Models\MyProjectDB.Designer.cs:line 4941

1 Ответ

0 голосов
/ 23 сентября 2010

Пара замечаний по поводу вашего кода:

  1. Вы говорите, что у вас есть модель представления, но то, что я вижу, больше похоже на автоматически сгенерированную модель Entity Framework. Свойства типа объекта, ... arghhh ...
  2. Вы включаете MicrosoftMvcValidation.js и MicrosoftMvcJQueryValidation.js, но они взаимоисключающие. Вы должны решить, будете ли вы выполнять проверку клиента с помощью MS Technology или jquery validate plugin.

Вы не показали ни кода действий контроллера, ни точной трассировки стека исключений, которую вы получаете. Вы говорите, что действие Post не выполнено, но вы получаете исключение. Где вы берете это исключение?

...