更新数据库记录

问题描述:

我正在尝试使用C#MVC更新配置文件表中的现有记录。更新数据库记录

我需要制作2个单独的注册表格。

我已经完成了第一个工作,它按照计划工作,它使用基本信息在数据库中创建用户记录。

[HttpPost] 
    public ActionResult Register(Registration signingUp) 
    { 
     var db = new ShareRideDBEntities(); 

     if (ModelState.IsValid) 
     { 
      var Data = db.tblProfiles.Create(); 

      Data.Prof_Email = signingUp.Email; 
      Data.Prof_Password = signingUp.Password; 
      db.tblProfiles.Add(Data); 

      int Saved = db.SaveChanges(); 

      if (Saved != 0) 
      { 
       Response.Write("Success."); 
      } 
      else 
      { 
       Response.Write("Error."); 
      } 
     } 
     if (ModelState.IsValid) 
     { 
      if (ValidateUser(signingUp.Email, signingUp.Password)) 
      { 
       FormsAuthentication.SetAuthCookie(signingUp.Email, false); 
       return RedirectToAction("Index", "Members"); 
      } 
      else 
      { 
       ModelState.AddModelError("", ""); 
      } 
     } 
     return View(); 
    } 

我想现在要做的是添加到现有记录一些新的信息使用另一种形式。

如果他/她是男性或女性,表单会询问他的姓名,姓氏,电话号码和选项(带有单选按钮)。

如果您需要更多信息,请评论,我会尽快解决。

编辑:

Model

public class Registration 
{ 
    [EmailAddress] 
    public string Email { get; set; } 

    [DataType(DataType.Password)] 
    public string Password { get; set; } 
} 

我的第二个model

public class ServiceRegistration 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Phone { get; set; } 
} 

我还没有在HttpPost方法的第二登记完成,因为我不是当然如何去做。

编辑:

好了,所以我已经对我我MembersController.cs控制器上有

ServiceRegistration.cs模型

using System.Web; 
using System.ComponentModel.DataAnnotations; 

namespace ShareRide.Models.Service 
{ 
    public class ServiceRegistration 
    { 
     [Required] 
     public Guid UserID { get; set; } 

     [Required(AllowEmptyStrings= false, ErrorMessage="Necesary Field.")] 
     public string FirstName{ get; set; } 

     [Required(AllowEmptyStrings = false, ErrorMessage = "Necesary Field.")] 
     public string LastName{ get; set; } 

     [Required(AllowEmptyStrings = false, ErrorMessage = "Necesary Field.")] 
     public string Phone{ get; set; } 
    } 
} 

public ActionResult Registrationform() 
    { 
     return View(); 
    } 

    [HttpGet] 
    public ActionResult Registrationform(Guid UserID) 
    { 
     var model = new ServiceRegistration { UserID = UserID }; 

      return View(model); 
    } 

    [HttpPost] 
    public ActionResult Registrationform(ServiceRegistration model) 
    { 
     var db = new ShareRideDBEntities(); 
     if (ModelState.IsValid) 
     { 
      var Data = db.tblProfiles.Create(); 

      Data.PROF_UserID = model.UserID; 
      Data.PROF_FirstName = model.Home_Address; 
      Data.PROF_LastName = model.Work_Address; 
      Data.PROF_Phone = model.Travel_Days; 

      db.SaveChanges(); 

      return RedirectToAction("Index", "Members"); 

     } 
     return View(model); 
    } 

现在回答一些变化基地我在上遇到错误0 Cannot implicitly convert type 'System.Guid' to 'int'

在我的数据库中PROF_UserID是主键,并且是int

而且我评论了Data.PROF_UserID = model.UserID;这样我就可以建立,但是当我尝试访问Registrationform视图返回一个错误: View error

+1

我已经编辑好标题添加一行。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 –

+0

如果您使用JavaScript创建多页表单并一次性发送所有数据与您的动作呼叫可能更容易 –

+0

@IsabelHM事情是,我被迫这样做因为第二种形式的目的是另一种服务包含在我们的网站中,仅适用于已经注册的用户。 –

首先,你需要修改你的ServiceRegistration模式,以你的用户ID,这样我们就可以将其附加到我们的实体。我还为验证目的添加了数据注释,但如果您愿意,您可以选择忽略这些注释。

public class ServiceRegistration 
{ 
    [Required] 
    public int Id { get; set; } 
    [Required] 
    public String FirstName { get; set; } 
    [Required] 
    public String LastName { get; set; } 
    [Required] 
    public String Phone { get; set; } 

} 

接下来你需要两个动作。一个从GET请求提供表单,另一个从POST请求保存记录。

通知我们如何传递用户的ID通过

public ActionResult AddUserInfo(int id) 
{ 
    var model = new ServiceRegistration{ id = id } 

    return View(model); 
} 

林不知道如何使你的DbContext是寻找或添加用户,所以你需要添加这个自己

[HttpPost] 
public ActionResult AddUserInfo(ServiceRegistration model) 
{ 

    var db = new ShareRideDBEntities(); 

    if(ModelState.IsValid) 
    { 

     //Find your user in your db context using model.Id as the reference 

     //Add the User Data from the model 

     db.SaveChanges(); 

     return RedirectToAction("Index", "Controller"); 

    } 

    //Form isn't valid so return form will the validation errors 
    return View(model); 

} 

最后你视图应该命名为AddUserInfo,看起来应该是这样的

@model my.namespace.ServiceRegistration 

@using(Html.BeginForm(“AddUserInfo”, “Controller”, HttpMethod.Post)) 
{ 
    <!--Hide the id from the user--> 
    Html.HiddenFor(m => m.Id) 

    Html.TextboxFor(m => m.FirstName) 
    Html.TextboxFor(m => m.LastName) 
    Html.TextboxFor(m => m.Phone) 

    Html.ValidationSummary(); 

    <input type=“submit” value=“Save” /> 
} 

我刚刚写了这个在我的Mac的记事本应用程序中,因此可能会出现一些语法错误,所以我提前致歉。

我希望这会有所帮助。

+0

嗨,即时通讯Data.PROF_UserID = model.UserID;错误'注意我改变了你的例子' id'到'UserID'在我的数据库中,列的名字是'PROF_UserID',错误是'不能隐式地将类型'System.Guid'转换为'int'' –

+0

它告诉你Prof_UserID的类型是int not Guid。所以你的UserId模型需要是int类型的。我更新我的答案以反映这个新信息 – heymega

+0

另外,如果您的用户ID在数据库中自动递增,则无需事先设置。 – heymega

如果将用户重定向到不同的视图页面,则需要使用TempData而不是ViewBag。这是一个粗略的代码示例。您可能需要对其进行修改以适应您的需求。

型号

public class Registration 
{ 
    [EmailAddress] 
    public string Email { get; set; } 

    [DataType(DataType.Password)] 
    public string Password { get; set; } 

    public virtual ServiceRegistration ServiceRegistration { get; set; } 
} 

在您的通话HTTPPOST,在条件的ValidateUser声明

if (ValidateUser(signingUp.Email, signingUp.Password)) 
    { 
     FormsAuthentication.SetAuthCookie(signingUp.Email, false); 
     TempData["Registration"] = signingUp; 
     return RedirectToAction("Index", "Members"); 
    } 

查看

@{ 
    var tempRegistration = TempData["Registration"] as Registration 
} 

@Html.HiddenFor(model => model.Email, new { id = "email", value= tempRegistration})