设置我有一个模型对象调用问题:ASP.NET MVC表单值不上张贴
[Table(Name = "Problems")]
public class Problem
{
[HiddenInput(DisplayValue = false)]
[Column(IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)]
public int ProblemId { get; set; }
[Display(ResourceType = typeof(Resources.Resources), Name = "TablePersonStudentName")]
[Column] public int StudentId { get; set; }
[Display(ResourceType = typeof(Resources.Resources), Name = "TableCommunicationTypesName")]
[Column] public int CommunicationTypeId { get; set; }
[Display(ResourceType = typeof(Resources.Resources), Name = "TableProblemTypeName")]
[Column] public int ProblemTypeId { get; set; }
[Display(ResourceType = typeof(Resources.Resources), Name = "TableMitigatingCircumstanceLevelName")]
[Column] public int MitigatingCircumstanceLevelId { get; set; }
[Display(ResourceType = typeof(Resources.Resources), Name = "TableProblemDate")]
[Column] public DateTime? DateTime { get; set; }
[Display(ResourceType = typeof(Resources.Resources), Name = "TableProblemOutline")]
[Column] public string Outline { get; set; }
[Display(ResourceType = typeof(Resources.Resources), Name = "TableProblemFile")]
[Column] public byte[] MitigatingCircumstanceFile { get; set; }
[Display(ResourceType = typeof(Resources.Resources), Name = "TableProblemAbsentFrom")]
[Column] public DateTime? AbsentFrom { get; set; }
[Display(ResourceType = typeof(Resources.Resources), Name = "TableProblemAbsentUntil")]
[Column] public DateTime? AbsentUntil { get; set; }
[Display(ResourceType = typeof(Resources.Resources), Name = "TableProblemRequestedFollowUp")]
[Column] public DateTime? RequestedFollowUp { get; set; }
public CommunicationType CommunicationType { get; set; }
public MitigatingCircumstanceLevel MitigatingCircumstanceLevel { get; set; }
public ProblemType ProblemCategory { get; set; }
public ICollection<ProblemCommunication> ProblemCommunications { get; set; }
public ICollection<AssessmentExtension> AssessmentExtensions { get; set; }
public ICollection<User> Users { get; set; }
}
由于这种模式包含了许多从我使用dropdownlists其他数据库表在我看来对象的使用视图模型:
public class ProblemViewModel
{
public Problem Problem { get; set; }
public SelectList Students { get; set; }
public SelectList CommunicationType { get; set; }
public SelectList MitigatingCircumstanceLevel { get; set; }
public SelectList ProblemType { get; set; }
public MultiSelectList ProblemUsers { get; set; }
public ProblemViewModel(Problem problem, ISqlStudentRepository sqlStudentRepository,
ISqlCommunicationTypeRepository sqlCommunicationTypeRepository, ISqlMitigatingCircumstanceLevelRepository sqlMitigatingCircumstanceRepository,
ISqlProblemTypeRepository sqlProblemTypeRepository, ISqlUserRepository sqlUserRepository,
string username)
{
this.Problem = problem;
this.Students = new SelectList(sqlStudentRepository.Students.ToList(), "StudentId", "FirstName");
this.CommunicationType = new SelectList(sqlCommunicationTypeRepository.CommunicationTypes.ToList(), "CommunicationTypeId", "Name");
this.MitigatingCircumstanceLevel = new SelectList(sqlMitigatingCircumstanceRepository.MitigatingCircumstanceLevels.ToList(), "MitigatingCircumstanceLevelId", "Name");
this.ProblemType = new SelectList(sqlProblemTypeRepository.ProblemTypes.ToList(), "ProblemTypeId", "TypeName");
this.ProblemUsers = new MultiSelectList(sqlUserRepository.Users.Where(s => s.UserName != username).ToList(), "UserId", "UserName");
}
}
这是在导航生成对问题/创建控制器的方法:
public ViewResult Create()
{
string username = User.Identity.Name;
return View("Edit", new ProblemViewModel(new Problem(), sqlStudentRepository,
sqlCommunicationTypeRepository, sqlMitigatingCircumstanceRepository,
sqlProblemTypeRepository, sqlUserRepository, username));
}
这里是ascx的看法:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<BournemouthUniversity.WebUI.Models.ProblemViewModel>" %>
<div class="editor-field">
<%: Html.HiddenFor(model => model.Problem.ProblemId)%>
<%: Html.ValidationMessageFor(model => model.Problem.ProblemId)%>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.Problem.StudentId) %>
</div>
<div class="editor-field">
<%: Html.DropDownListFor(model => model.Problem.StudentId, Model.Students)%>
<%: Html.ValidationMessageFor(model => model.Problem.StudentId)%>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.Problem.CommunicationTypeId)%>
</div>
<div class="editor-field">
<%: Html.DropDownListFor(model => model.Problem.CommunicationTypeId, Model.CommunicationType)%>
<%: Html.ValidationMessageFor(model => model.Problem.CommunicationTypeId)%>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.Problem.ProblemTypeId)%>
</div>
<div class="editor-field">
<%: Html.DropDownListFor(model => model.Problem.ProblemTypeId, Model.ProblemType)%>
<%: Html.ValidationMessageFor(model => model.Problem.ProblemTypeId)%>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.Problem.MitigatingCircumstanceLevelId)%>
</div>
<div class="editor-field">
<%: Html.DropDownListFor(model => model.Problem.MitigatingCircumstanceLevelId, Model.MitigatingCircumstanceLevel)%>
<%: Html.ValidationMessageFor(model => model.Problem.MitigatingCircumstanceLevelId)%>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.Problem.DateTime)%>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.Problem.DateTime, new { @class = "datePicker" })%>
<%: Html.ValidationMessageFor(model => model.Problem.DateTime)%>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.Problem.Outline)%>
</div>
<div class="editor-field">
<%: Html.TextAreaFor(model => model.Problem.Outline, 6, 70, new { maxlength = 255 })%>
<%: Html.ValidationMessageFor(model => model.Problem.Outline)%>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.Problem.AbsentFrom)%>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.Problem.AbsentFrom, new { @class = "datePicker" })%>
<%: Html.ValidationMessageFor(model => model.Problem.AbsentFrom)%>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.Problem.AbsentUntil)%>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.Problem.AbsentUntil, new { @class = "datePicker" })%>
<%: Html.ValidationMessageFor(model => model.Problem.AbsentUntil)%>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.Problem.RequestedFollowUp)%>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.Problem.RequestedFollowUp, new { @class = "dateTimePicker" })%>
<%: Html.ValidationMessageFor(model => model.Problem.RequestedFollowUp)%>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.Problem.Users)%>
</div>
<div class="editor-field">
<%: Html.ListBoxFor(model => model.Problem.Users, Model.ProblemUsers, new { @class = "multiselect" })%>
<%: Html.ValidationMessageFor(model => model.Problem.Users)%>
</div>
<p>
<input type="submit" class="button" value="Save" />
</p>
<% } %>
然而,当我提交输入了[HttpPost]编辑控制器动作,但与空为广大值的形式...
[HttpPost]
public ActionResult Edit(Problem problemValues)
{
try
{
MembershipUser myObject = Membership.GetUser();
String UserId = myObject.ProviderUserKey.ToString();
Problem problem = problemValues.ProblemId == 0
? new Problem()
: sqlProblemRepository.Problems(UserId).First(p => p.ProblemId == problemValues.ProblemId);
TryUpdateModel(problem);
if (ModelState.IsValid)
{
sqlProblemRepository.SaveProblem(problem);
TempData["message"] = problem.ProblemId + " has been saved.";
if (Request.IsAjaxRequest())
{
return Json(problem);
}
return RedirectToAction("Details", "Student", new { problem.StudentId });
}
else
return View(problem);
}
catch (Exception ex)
{
if (Request.IsAjaxRequest())
{
return Json(null);
}
else
{
TempData["message"] = "Record Not Found.";
return RedirectToAction("Index");
}
}
}
在这个任何想法,将APPR eciated它似乎发生在我有大多数形式的下拉列表,但我不明白为什么所有的值都是空的,即使是非下拉字段。
在此先感谢...
乔纳森
进入viewmodel ...这是一个代码气味 – 2010-09-02 10:54:58
感谢您的意见。我对ASP.NET MVC很陌生。我只是想出了一个解决方案来实现它。我想我应该在控制器中填充SelectLists所需的列表,然后将它们传递给viewModel。 – 2010-09-02 11:04:38