ASP.NET MVC Page Validation Fails (The value is invalid.)

痴心易碎 提交于 2019-12-11 02:04:22

问题


I'm trying to create ASP.NET MVC Application with Entity Framework, which has One to Many relationship. For that I have successfully managed to load the appropriate list of items to a dropdown control (in Create view), But when I click the Create button (in Create view) page validation is faild, validation error message is The value '1' is invalid..

Error

Model

public class Post
{
    public int Id { get; set; }
    ...
    public virtual Person Author { get; set; }
}

DataBaseContext

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    modelBuilder.Entity<Post>()
                .HasOptional(p => p.Author);
}

Controller

public ActionResult Create()
    {
        PopulateAuthorDropDownList();
        return View();
    }

    [HttpPost]
    public ActionResult Create(Post post)
    {
        if (ModelState.IsValid)
        {
            db.Posts.Add(post);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        PopulateAuthorDropDownList(post.Author);
        return View(post);
    }

    private void PopulateAuthorDropDownList(object selectedPerson = null)
    {
        var personQuery = from d in db.People
                          orderby d.Name
                          select d;
        ViewBag.Author = new SelectList(personQuery, "Id", "Name", selectedPerson);
    }

View

    <div class="editor-label">
        @Html.LabelFor(model => model.Author)
    </div>
    <div class="editor-field">
        @Html.DropDownList("Author", String.Empty)
        @Html.ValidationMessageFor(model => model.Author)
    </div>

When I check Author table in database there is Record with Id 1, so I guess 1 is a valid value. What am I missing here?

Thanks in advance...


回答1:


You didn't show how the Author object looks like,

Suppose if it is like this,

public class Author
{ 
   public int Id{get;set;}
   public string Name{get;set;}
}

Try this,

<div class="editor-label">
    @Html.LabelFor(model => model.Author)
</div>
<div class="editor-field">
    @Html.DropDownListFor(model => model.Author.Id, ViewBag.Author, "Select an Author")
    @Html.ValidationMessageFor(model => model.Author)
</div>



回答2:


Managed to fix this by

changing Model to

public class Post
{
    public int Id { get; set; }
    ...
    public int Author { get; set; } // changed type to int
}

changing View to

    <div class="editor-label">
        @Html.LabelFor(model => model.Author)
    </div>
    <div class="editor-field">
        @Html.DropDownList("AuthorId", String.Empty)
        @Html.ValidationMessageFor(model => model.Author)
    </div>

changing Controller to

private void PopulateAuthorDropDownList(object selectedPerson = null)
    {
        var personQuery = from d in db.People
                          orderby d.Name
                          select d;
        ViewBag.AuthorId = new SelectList(personQuery, "Id", "UserName", selectedPerson); //Changed Author to AuthorId
    }

and removing

    modelBuilder.Entity<Post>()
                .HasOptional(p => p.Author);

from DataBaseContext

Anyway Thanks for the answers... :)




回答3:


You should have something like this:

<div class="editor-label">
    @Html.LabelFor(model => model.Author.Name)
</div>
<div class="editor-field">
    @Html.DropDownListFor(model => model.Author.Name, (SelectList)ViewBag.AuthorList)
    @Html.ValidationMessageFor(model => model.Author.Name)
</div>

Note that you should name ViewBag.AuthorList instead of ViewBag.Author




回答4:


You have to provide a list of options to DropDownList where you are just passing string.empty.

And i You should use the strongly typed version DropDownListFor:

@Html.DropDownListFor(model => model.Author.Name, Model.AuthorList)

Or maybe even better by not using the name but the Id:

@Html.DropDownListFor(model => model.Author.Id, Model.AuthorList)

And your model:

class Model {
    ...
    public SelectList AuthorList {get;set;}
}

And in your controller:

model.AuthorList = new SelectList(fetchAuthors()
                         .Select(a => new SelectListItem {
                                          Text = a.Name,
                                          Value = a.Id 
                                      }, "Value", "Text");


来源:https://stackoverflow.com/questions/11030459/asp-net-mvc-page-validation-fails-the-value-is-invalid

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!