我会保持简单。
我的控制器
public ActionResult Registrationform()
{
if (Session["UserID"] == null)
{
return RedirectToAction("Index", "Main");
}
else
{
return View();
}
}
[HttpPost]
public ActionResult Registrationform(AddressRegistration model)
{
var db = new AddressDBEntities();
if (ModelState.IsValid)
{
var Data = db.tblProfiles.Create();
Data.PROF_HomeAddr = model.Home_Address;
Data.PROF_WorkAddr = model.Work_Address;
db.tblProfiles.Add(Data);
db.SaveChanges();
return RedirectToAction("Index", "Members");
}
return View(model);
}
我的模特
using System.Web;
using System.ComponentModel.DataAnnotations;
namespace Address.Models.Address
{
public class AddressRegistration
{
[Required(AllowEmptyStrings= false, ErrorMessage="Este campo es necesario.")]
public string Home_Address { get; set; }
[Required(AllowEmptyStrings = false, ErrorMessage = "Necesary field.")]
public string Work_Address { get; set; }
}
}
我的观点
@model Address.Models.Address.AddressRegistration
@using (Html.BeginForm("Registrationform", "Members", FormMethod.Post, new {id = "wizardform"}))
{
@Html.ValidationSummary(true, "Please fix the errors.")
@Html.TextBoxFor(m => m.Home_Address)
@Html.TextBoxFor(m => m.Work_Address)
<input type="submit" value="submit" />
}
我正在尝试在用户登录其帐户后更新我的数据库中的记录。他可以填写此表并更新他的地址。
我的数据库目前默认为NULL
。
我将主键设置为名为PROF_UserID
的列。
如果用户尝试访问MembersController.cs
次观看,他/她将被重定向if (Session["UserID"] == null)
。
我正在尝试通过将家庭地址添加到PROF_UserID
并将工作地址添加到数据库中的PROF_HomeAddress
来更新特定PROF_WorkAddress
的记录,该记录已经登录了我正在使用的方法只创建一个新记录,而不是更新它。
我已经搜索了一段时间,我找不到任何关于如何在MVC 4 C#中做到这一点的答案,以及没有。
谢谢,如果您需要更多信息,请发表评论。
编辑:
我在答案上改变了一些代码。
控制器
[HttpPost]
public ActionResult Registrationform(AddressRegistration model)
{
var db = new AddressDBEntities();
if (ModelState.IsValid)
{
var updateData = db.tblProfiles.FirstOrDefault(r => r.PROF_UserID == model.UserID);
if (updateData != null)
{
updateData.PROF_HomeAddr = model.Home_Address;
updateData.PROF_WorkAddr = model.Work_Address;
db.SaveChanges();
}
return RedirectToAction("Index", "Members");
}
Response.Write("Error");
return View();
}
模型
using System.Web;
using System.ComponentModel.DataAnnotations;
namespace Address.Models.Adress
{
public class AddressRegistration
{
public int UserID { get; set; }
[Required(AllowEmptyStrings= false, ErrorMessage="Necesary field.")]
public string Home_Address { get; set; }
[Required(AllowEmptyStrings = false, ErrorMessage = "Necesary field.")]
public string Work_Address { get; set; }
}
}
查看
@model Address.Models.Address.AddressRegistration
@using (Html.BeginForm("Registrationform", "Members", FormMethod.Post, new {id = "wizardform"}))
{
@Html.HiddenFor(m=> m.UserID)
@Html.ValidationSummary(true, "check for errors.")
@Html.TextBoxFor(m => m.Home_Address)
@Html.TextBoxFor(m => m.Work_Address)
@Html.ValidationMessageFor(m=>m.Work_Address)
<input type="submit" value="submit" />
}
我已经尝试了这一点,但它最终会给我@Html.ValidationSummary(true, "check for errors.")
错误和Response.Write("Error")
错误。
由于某种原因,控制器中的ModelState.IsValid
返回false。
我做错了什么?
如果我删除了@Html.HiddenFor(m=>m.UserID)
,它将返回model.UserID
始终为0,这在数据库中找不到,我该怎么做才能找到当前用户登录的UserID?
我的MainController
有
private bool ValidateUser(string Email, string Password)
{
bool isValid = false;
using (var db = new AddressDBEntities())
{
var User = db.tblProfiles.FirstOrDefault(u => u.PROF_Email == Email);
if (User.PROF_Password == Password)
{
Session["UserID"] = User.PROF_UserID;
isValid = true;
}
}
return isValid;
}
答案 0 :(得分:1)
但我使用的方法只创建一条新记录,而不是更新它。
要更新记录,您需要先从数据库中获取该记录,更新其字段,然后保存更改。
var updateData = db.tblProfiles.FirstOrDefault(r=> r.PROF_UserID == YourUserID);
if(updateData != null) // record found
{
//update fields with new values.
updateData.PROF_HomeAddr = model.Home_Address;
updateData.PROF_WorkAddr = model.Work_Address;
}
db.SaveChanges(); //persist changes to database
答案 1 :(得分:1)
您需要将视图绑定到当前为空的模型:
public ActionResult Registrationform()
{
if (Session["UserID"] == null)
{
return RedirectToAction("Index", "Main");
}
else
{
return View();
}
}
相反,做一些事情:
public ActionResult Registrationform()
{
if (Session["UserID"] == null)
{
return RedirectToAction("Index", "Main");
}
else
{
//here, use the UserID to get a reference to the user in your database and pass that to your view:
var registration = new AddressRegistration{
UserId = (int)Session["UserId"].ToString()
};
return View(registration);
}
}
然后,您的隐藏字段将保留用户ID,并且在您的后期操作中,模型应该正确绑定。但是,请考虑在控制器操作上使用Authorize属性 - see here。有更好的方法来控制访问权限而不是自己动手。
希望这能让你走上正轨。