ASP.Net-MVC-3初学者的问题与视图模型和提交他们回到控制器



我已经通过数据库优先建立了我的实体,因为我必须使用现有的数据库。

现在,假设我有实体客户和国家,我想编辑客户。我的视图应该包含名字,姓氏和国家这是来自实体中所有国家的下拉列表。为此,我创建了一个使用这两个实体的CustomerViewModel。但我不知道是否所有这些都是正确的,因为有些东西不工作。

首先我的CustomerViewModel的代码:

public class CustomerViewModel
{
    public CUSTOMER customer { get; set; }
    public COUNTRY country { get; set; }
    public IEnumerable<SelectListItem> countryList { get; set; }
    MyEFEntities db = new MyEFEntities();
    public CustomerViewModel(int id)
    {
        IEnumerable<CUSTOMER> customerList = from c in db.CUSTOMER
                                             where c.CUSTOMERNO== id
                                             select c;
        customer = customerList.First();
        var countryListTemp = new List<String>();
        var countryListQry = from s in db.COUNTRY
                             select s.COUNTRY_ABBREVIATION;
        countryListTemp.AddRange(countryListQry);
        countryList = new SelectList(countryListTemp);
    }
}

然后CustomerController.cs:

public ViewResult CustomerData(int id = 0)
{
    // if (id == 0) { ... }
    var viewModel = new CustomerViewModel(id);
    return View(viewModel);
}
[HttpPost]
public ActionResult CustomerData(CustomerViewModel model)
{
    db.Entry(model.customer).State = System.Data.EntityState.Modified;
    db.SaveChanges();
    return View(model);
}

最后但并非最不重要的CustomerData.cshtml:

@model MyApp.ViewModels.CustomerViewModel
@{
    ViewBag.Title = "Customer";
}
<h2>
    Customer</h2>
@using (Html.BeginForm("CustomerData", "Customer"))
{
    @Html.ValidationSummary(true)
    <div id="tabs">
        <ul>
            <li><a href="#data">Data</a></li>
            <li><a href="#hobbies">Hobbies</a></li>
            <li><a href="#stuff">Stuff</a></li>
        </ul>
        <div id="data">
            <div class="editor-label">
                @Html.Encode("Country:")
            </div>
            <div class="editor-field">
            @Html.DropDownListFor(m => m.country.COUNTRY_ABBREVIATION, Model.countryList, Model.customer.ADDRESS.COUNTRY.COUNTRY_ABBREVIATION)
            </div>
            <div class="editor-label">
                @Html.Encode("Last name:")
                @Html.TextBox("lastName", @Model.customer.ADDRESS.NAME)
            </div>
            <div class="editor-label">
                @Html.Encode("First Name:")
                @Html.TextBox("firstName", @Model.customer.ADDRESS.FIRSTNAME)
            </div>
        </div>
        <div id="hobbies">
            <p>
                Hobbies
            </p>
        </div>
        <div id="stuff">
            <p>
                Stuff
            </p>
        </div>
    </div>
    <p>
        <input type="submit" value="Save" />
    </p>
}

观看效果很好。我访问URL http://localhost:12345/Customer/CustomerData/4711,可以看到该客户的当前值。

现在,我错过了一些东西。

  1. 保存按钮不工作。如果单击它,就会得到一条错误消息,即没有为该对象找到无参数构造函数。但我想把ViewModel传递回控制器。如何重载Html.BeginForm()方法?

  2. 我如何存储来自客户的更改值?是通过编辑文本字段完成的,还是我必须使用Html.TextboxFor()而不是Html.Textbox?这对初学者来说太复杂了。我一点也不喜欢LINQ风格

  3. 下拉列表不能正常工作。客户所在的国家已经有两次了。第三个参数似乎没有预先选择一个项目,而是添加了一个默认的项目。将Html。下拉列表更好?

恐怕这个设计很糟糕。永远不要从模型中访问数据库,这就是控制器的作用。模型应该只保存Controller提供给它的数据。

如果您将数据库访问或任何类型的逻辑从您的模型中分离出来,您将发现您的系统变得更容易设置和维护,并且它甚至可能解决您提到的问题。

相关内容

最新更新