将查询字符串 guid 值获取到我的控制器的创建中,而没有奇怪之处



注意:已编辑以添加型号

问题是:一个querystring guid值让我感到不适,试图将它输入到我的控制器中,这样我就可以用它作为参数创建一个新记录。到目前为止,我得到的最接近的一个加载了一个包含所有0和短划线的记录作为guid(这不仅是错误的,而且看起来非常奇怪。)

这是MVC3/EF4中的一个遗留数据库以及一些遗留页面和URL。我正在开发的应用程序包括一个记笔记功能,用户a可以在其中记下关于用户B的笔记(例如。)两个用户都有自己的guid Id来标识他们,存储笔记的表有一个笔记本身的Id列,然后有两个Id列来跟踪这个特定笔记的哪个是用户a,哪个是用户B。

我们总是可以假设用户A是当前用户,并通过这种方式获取他的Id。遗留URL之一是如何获取用户B的Id。

例如:www.mysite.com/notes/user/ED88B0B1-B552-4D63-BD20-C94B837440BE

在我们的示例中,"用户A"的guid为ScannerUserId

"用户B"(来自查询字符串)的guid为ScanneCodeId

这是型号:

public partial class Note
{
    public System.Guid ScannerUserId { get; set; }
    public System.Guid ScannedCodeId { get; set; }
    public System.Guid NoteId { get; set; }
    public string NoteDetail { get; set; }
    public virtual Code Code { get; set; }
    public virtual Contact Contact { get; set; }
}

以下是视图:

@model MySite.Models.Note
@{
ViewBag.Title = "Create";
}
<h2>Create</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
    <legend>Note</legend>
    <div class="editor-label">
        @Html.LabelFor(model => model.NoteDetail)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.NoteDetail)
        @Html.ValidationMessageFor(model => model.NoteDetail)
    </div>
    <p>
        <input type="submit" value="Create" />
    </p>
</fieldset>
}

这是关于创建:的控制器部分

public class NoteController : Controller
{
    //
    // GET: /Note/Create
    public ActionResult Create()
    {
        ViewBag.ScannedCodeId = new SelectList(db.Codes, "CodeId", "ScannedCodeId");
        ViewBag.ScannerUserId = new SelectList(db.Contacts, "UserId", "ScannerUserId");
        return View();
    } 
    //
    // POST: /Note/Create
    [HttpPost]
    public ActionResult Create(Note note)
    {
        if (ModelState.IsValid)
        {
            note.NoteId = Guid.NewGuid();
            note.ScannerUserId = (Guid)System.Web.Security.Membership.GetUser().ProviderUserKey;
            //note.ScannedCodeId = new Guid(Request.QueryString[""]);
            note.CreateDate = DateTime.Now;
            note.LastActivityDate = DateTime.Now;
            db.Notes.Add(note);
            db.SaveChanges();
            return RedirectToAction("Index");  
        }
        ViewBag.ScannedCodeId = new SelectList(db.Codes, "CodeId", "ScannedCodeId", note.ScannedCodeId);
        ViewBag.ScannerUserId = new SelectList(db.Contacts, "UserId", "ScannerUserId", note.ScannerUserId);
        return View(note);
    }

如何将querystring中的guid获取到注释中。ScanneCodeId使得db。SaveChanges不会在我身上爆炸吗?

同时,感谢你读到这篇文章,以及你能做的任何帮助。

我相信Note就是您的ViewModel。在中添加一个WrittenFor属性

(我在这个例子中使用Int数据类型来保持这个答案的简单性和可读性。你可以用你唯一的id/guid的字符串来代替它)

public class Note
{
  public string NoteDescr { set;get;}
  public int WrittenBy { set;get;}
  public int WrittenFor { set;get;}
}

在你的get action方法中,将这个视图模型返回到你的视图

[HttpGet]
public ActionResult Create(int friendId)
    {
        Note objVm=new Note();
        objVm.WrittenFor=friendId;
        return View(objVm);
    } 

所以用户可以像一样浏览来访问这个页面

http://yourdomain/yourcontroller/create/589476

这意味着您(当前用途在id为589476的用户的墙上(或笔记本..:))。

在您的视图中,使用@Html.HidFor Html helper方法将其放入表单中。然后,当你提交表单时,你会在视图模式下得到它,这是HttpPost创建方法的一个参数

@model Note
@using (Html.BeginForm())
{   
  @Html.TextBoxFor(m=>m.NotDesc)
  @Html.HiddenFor(m => m.WrittenFor)
  <input type="submit" value="Create" />
}

在你的HttpPost操作方法中,你有你想要的

[HttpGet]
public ActionResult Create(Note objNote)
{
   int friendId= objNote.WrittenFor 
   string note=objNote.NoteDesc
   //Now you can save your value 
}

考虑到使用类型Guid而不是类型Int所需的更改,Shyju给了我答案。非常感谢。

最新更新