2016-06-28 2 views
-1

Я совершенно новый в ASP.Net MVCНедопустимая модель состояние в Личных данные с формой в MVC5

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

Мне очень жаль, потому что я не знаю, что это проблема, которую я не мог сократить его:

вот моя модель:

public class Request 
{ 
    //pkey 
    public virtual int Id { get; set; } 
    //Fkey 
    public virtual int TourId { get; set; } 

    [Required] 
    [MaxLength(150, ErrorMessageResourceType = typeof(ErrorResource), ErrorMessageResourceName = "CheckLenght")] 
    public virtual string FirstName { get; set; } 


    [Required] 
    [MaxLength(150, ErrorMessageResourceType = typeof(ErrorResource), ErrorMessageResourceName = "CheckLenght")] 
    public virtual string LastName { get; set; } 

    [Required] 
    [EmailAddress(ErrorMessageResourceType = typeof(ErrorResource), ErrorMessageResourceName = "Email")] 
    [MaxLength(150, ErrorMessageResourceType = typeof(ErrorResource), ErrorMessageResourceName = "CheckLenght")] 
    public virtual string Email { get; set; } 

    [Required] 
    public virtual string Phone { get; set; } 

    [MaxLength(100000000, ErrorMessageResourceType = typeof(ErrorResource), ErrorMessageResourceName = "CheckLenght")] 
    public virtual string Comment { get; set; } 


    public virtual bool FrequentTraveler { get; set; } 

    [Required] 
    [Range(1, 500000)] 
    public virtual int TravelersCount { get; set; } 


    [DataType(DataType.Date)] 
    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")] 
    public virtual string Date { get; set; } 


    public virtual bool ContactTimePreference { get; set; } 

    [MaxLength(150, ErrorMessageResourceType = typeof(ErrorResource), ErrorMessageResourceName = "CheckLenght")] 
    public virtual string Country { get; set; } 


    public virtual bool Archived { get; set; } 

и это моя форма в виде:

@using (Html.BeginForm("Create", "Request")) 
{ 
    <div class="form-group"> 
    <input type="hidden" name="TourId" value="4"/> 
    </div> 

<div class="form-group"> 
@Html.EditorFor(model => model.Request.FirstName, new { htmlAttributes = new { @class = "form-control" } }) 
@Html.ValidationMessageFor(model => model.Request.FirstName, "", new { @class = "text-danger" , placeholder = "FirstName" }) 

</div> 



<div class="form-group"> 
@Html.EditorFor(model => model.Request.LastName, new { htmlAttributes = new { @class = "form-control" } }) 
@Html.ValidationMessageFor(model => model.Request.LastName, "", new { @class = "text-danger" }) 
</div> 


<div class="form-group">          
@Html.EditorFor(model => model.Request.Email, new { htmlAttributes = new { @class = "form-control" } }) 
@Html.ValidationMessageFor(model => model.Request.Email, "", new { @class = "text-danger" }) 
</div> 

<div class="form-group"> 
@Html.EditorFor(model => model.Request.Phone, new { htmlAttributes = new { @class = "form-control" } }) 
@Html.ValidationMessageFor(model => model.Request.Phone, "", new { @class = "text-danger" }) 
</div> 


<div class="form-group ft"> 
@Html.EditorFor(model => model.Request.FrequentTraveler) 
@Html.ValidationMessageFor(model => model.Request.FrequentTraveler, "", new { @class = "text-danger" }) 
    </div> 


<div class="form-group"> 
    <input type="hidden" name="TravelersCount" value="3" /> 
</div> 

    <div class="form-group"> 
    <input type="hidden" name="TravelersCount" value="3" /> 
    </div> 



} 

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

и это мое создать действие в контроллере Request:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create([Bind(Include = "Id,TourId,FirstName,LastName,Email,Phone,Comment,FrequentTraveler,TravelersCount,Date,ContactTimePreference,Country,Archived")] Request request) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Requests.Add(request); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View(); 
    } 

Я признателен, если кто-нибудь сказать мне, что это проблема сделать мой объект запроса valid.and, если его возможно, что нужно сделать, чтобы отправлять ошибки в пользователь, когда, например, они ставят нуль во имя, которое требуется для сервера.

+1

Start, удалив свой '[Bind]' атрибут. –

+0

Объект 'ModelState' скажет вам, что именно не так, взгляните туда, потому что это неверно. – DavidG

+0

@ DavidG. Спасибо за заботу. где я могу проверить мой ModelState? –

ответ

1

ModelState будет недействительным, так как ваше представление создает элементы управления формой для модели, которая отличается от модели, ожидаемой в методе POST. Например

@Html.EditorFor(model => model.Request.FirstName, ...) 

генерирует

<input type="text" name="Request.FirstName" .... /> 

но модель в методе POST является Request, который не имеет свойство с именем Request - он только один по имени FirstName так связыванию терпит неудачу и ModelState является недействительным, поскольку атрибута валидации [Required].

Для того, чтобы связываться с Request модели HTML необходимо будет

<input type="text" name="FirstName" .... /> 

Кроме того, ваш атрибут [Bind] также за исключением значения от правильно привязки, так как она включает "Request".

Удалить атрибут [Bind] (вы, кажется, хотят, чтобы связать все равно это значение по умолчанию) и либо изменить модель в методе POST, чтобы соответствовать моделям, объявленным в виде, либо использовать Prefix свойство BindAttribute

public ActionResult Create([Bind(Prefix= "Request")] Request model) 

и, наконец, удалить вручную HTML для скрытых входов и использовать @Html.HiddenFor(m => m.Request.TourId) и т.д., так что атрибуты имя последовательны и правильно связать.

Наконец, я рекомендую вам прочитать What is ViewModel in MVC?. Использование моделей данных в ваших представлениях, особенно при редактировании форм, является плохой практикой.

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

var errors = ModelState.Keys.Where(k => ModelState[k].Errors.Count > 0).Select(k => new 
{ 
    propertyName = k, 
    errorMessage = ModelState[k].Errors[0].ErrorMessage 
}); 
0

Нельзя использовать то же имя, что и параметр, как имя модели, что приведет к поломке процесса привязки на обратном пути. Попробуйте изменить подпись

public ActionResult Create(Request request)

в

public ActionResult Create(Request req)

Для проверки ошибок ModelState используйте следующий код:

foreach (ModelState modelState in ViewData.ModelState.Values) 
{ 
foreach (ModelError error in modelState.Errors) 
{ 
    var xx = error.ErrorMessage; 
} 
} 

Если вы поставили точку останова на var xx, вы увидите, что такое ошибка, но я уверен, что это потому, что нет правильной привязки из-за имен, которые вы использовали (на самом деле я изменю имя Request для чего-то еще полностью, но это только я).

Надеюсь, это поможет.

+0

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

Смежные вопросы