更新数据库中的记录

时间:2014-07-10 14:34:29

标签: c# asp.net-mvc asp.net-mvc-4

我会保持简单。

我的控制器

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;
}

2 个答案:

答案 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。有更好的方法来控制访问权限而不是自己动手。

希望这能让你走上正轨。