Валидаторы аннотаций данных с Entity Framework MVC4 - PullRequest
0 голосов
/ 02 апреля 2012

У меня есть следующий код View, Controller и Comment.cs, но я получаю ошибку,

Элемент модели, передаваемый в словарь, имеет тип 'TMPBlog.Models.Comment', но для этого словаря требуется элемент модели типа 'TMPBlog.Models.Post'.

Если я не введу текст в два обязательных текстовых поля @Html.TextBox ("CommentEmail") и @Html.TextArea ("CommentDetail", new {cols = " 65 ", rows =" 7 "}) , если я это сделаю, то работает нормально.

Код контроллера,

public ActionResult Index(int PostID)
{
    Post post = db.Posts.Single(p => p.PostID == PostID);
    return View(post);
}

[HttpPost]
public ActionResult Index(Comment comment)
{
    if (ModelState.IsValid)
    {
        string CommentEmail = comment.CommentEmail;

        string CommentDetail = comment.CommentDetail;
        CommentDetail = CommentDetail.Replace("\n", "<br />");
        comment.CommentDetail = CommentDetail;

        db.Comments.AddObject(comment);
        db.SaveChanges();

        return RedirectToAction("CommentResponse", new { id = comment.CommentID });
    }
    return View(comment);
}

Comment.cs

using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

namespace TMPBlog.Models
{
    [MetadataType(typeof(CommentMetaData))]
    public partial class Comment
    {
    }

    public class CommentMetaData
    {
        [Required(ErrorMessage = "You must enter an email address!")]
        public object CommentEmail { get; set; }

        [Required]
        public object CommentDetail { get; set; }
    }
}

вид,

@model TMPBlog.Models.Post

@Html.ValidationSummary("There is an error")

@using (Html.BeginForm())
{

    @Html.Hidden("CommentDate", String.Format("{0:yyyy-MM-dd HH:mm}", DateTime.Now))
    @Html.Hidden("PostCommentFK", @Html.DisplayFor(model => model.PostID))

    <br />
    <span class="BlueHeading">Add Your Comments Here!</span>
    <br /><br />

    <div class="editor-label">
        Email Address
    </div>
    <div class="editor-field">
        @Html.TextBox("CommentEmail")
        @Html.ValidationMessage("CommentEmail", "*")
    </div>

    <div class="editor-label">
        Comments
    </div>
    <div class="editor-field">
        @Html.TextArea("CommentDetail", new { cols = "65", rows = "7" })
        @Html.ValidationMessage("CommentDetail", "*")
    </div>

    <div class="editor-field">
        @Html.CheckBox("CommentTicked") Email me when others comment
    </div>
    <p>
        <input type="submit" value="Add Comment" />
    </p>
}

Как мне это решить?

Приветствия

Mike.

1 Ответ

0 голосов
/ 02 апреля 2012

Ваше мнение строго типизировано до TMPBlog.Models.Post, но в действии контроллера POST вы передаете комментарий:

return View(comment);

Это, очевидно, неправильно.

Вы можете просто вернуть тот же вид:

return View();

Поскольку все хранится в состоянии модели, представление будет корректно отображаться с соответствующими сообщениями об ошибках.

Также следующая строка:

@Html.Hidden("PostCommentFK", @Html.DisplayFor(model => model.PostID))

возможно, можно упростить:

@Html.Hidden("PostCommentFK", Model.PostID)
...