【问题标题】:Convert Dropdownlist item's value to int将下拉列表项的值转换为 int
【发布时间】:2012-12-11 06:40:07
【问题描述】:

我需要 SelectListItem 的值为 int。

所以我把它从数据库中拉出来,在这个过程中将它转换为字符串并存储到 listitem 的值。

public class BookAdd
{
public BookAdd()
{
public Book Book { get; set; }
DataModelContainer db = new DataModelContainer();
IEnumerable<SelectListItem> items = db.PublisherSet
               .Select(i => new SelectListItem
               {
                 Value = SqlFunctions.StringConvert((double)i.Id), 
                 Text = i.Name
               });
    }
}

然后,当从下拉列表中选择时,我需要再次将该值作为 int 存储到 Book.PublisherId。我知道下面的代码不完整,我想我需要以某种方式将所选项目的值转换为 int,我该怎么做?

@model Bookshops.Models.BookAdd
...
@Html.DropDownListFor(model => model.Book.PublisherId, Model.items);

最后是控制器:

    public ActionResult Create2()
    {
        var bookAdd = new BookAdd();
        ViewBag.Publisher = bookAdd.items;
        return View(bookAdd);
    }

    //
    // POST: /Book/Create

    [HttpPost]
    public ActionResult Create2(BookAdd book)
    {
            if (ModelState.IsValid)
            {
                Book book2 = new Book();
                book2.Id = book.Book.Id;
                book2.AuthorId = book.Book.AuthorId;
                book2.Isbn = book.Book.Isbn;
                book2.Id = int.Parse(book.Book.PubId);
                book2.Title = book.Book.Title;
                book2.YearPublished = book.Book.YearPublished;

                db.BookSet.Add(book2);
                db.SaveChanges();
            }
            return RedirectToAction("Index");
    }

我正在使用 MVC 3、EF 4。

【问题讨论】:

  • 你是如何接受控制器的?如果命名合适,模型绑定可能会接受它作为您的整数。您要提交完整的表格吗?你可能会做类似@Html.DropDownListFor(x => Convert.ToInt32(x.Book.PublisherId), Model.Items);但这只会给您的应用增加另一个故障点。
  • 我已经添加了我的控制器代码。我会尝试你建议的转换,让你知道结果
  • MVC 模型绑定应该为您处理转换,如果您在 BookAdd 模型上有适当的属性。您是否尝试过没有任何显式转换?如果你这样做了,结果如何?

标签: c# asp.net-mvc-3 entity-framework-4 razor drop-down-menu


【解决方案1】:

我没有构建SelectListItem,而是构建了这样的东西:

public struct BookItem
{
   int id;
   string name;
}

然后将以下项目添加到模型中并选择数据进入其中

IEnumerable<BookItem> bookList {get; set;}

最后

@Html.DropDownListFor(model => model.Book.PublicherId, new SelectList(Model.bookList, "id", "name"))

【讨论】:

    【解决方案2】:

    当 DropDownList 的选定项将被回发时,将其从字符串转换为 int,例如 Convert.ToInt32(DropDownSelectedItem) 或 Int32.TryParse(value, out number)

    【讨论】:

    • 您能详细说明一下吗?我究竟在哪里进行转换?
    • 示例:当您将数据发布回控制器/操作时,您可以对其进行转换
    • 我希望我可以对模型做一些 linq 魔法 => model.Book.PublisherId
    【解决方案3】:

    首先你可以将映射代码简化为

    db
        .PublisherSet
        .Select(x=> new SelectListItem{Value = x.Id.ToString(), Text = x.Name})
        .ToArray();
    

    在视图中你可以这样做

    @Html.DropDownListFor(model => model.Book.PublisherId, Model.items);
    

    它会正确呈现一个带有选项的选择元素,并选择适当的发布者。

    然后,当用户单击提交按钮时,您可以使用模型绑定约定将其传递回控制器操作。

    最后,都是文字。这就是网络的本质。我们有很多技巧、转换器和绑定器将字符串字典转换为丰富的视图模型,但最终它只是字符串。

    【讨论】:

    • 您的映射代码只是导致:LINQ to Entities 无法识别方法 'System.String ToString()' 方法,并且该方法无法转换为存储表达式。
    • 我并不担心 Linq 表达式,它会做正确的事情。我需要第二个片段将值转换为 int。
    • 模型绑定应该会自动为您执行此操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多