获取查询字符串guid值到我的控制器创建没有奇怪

时间:2012-04-03 03:01:17

标签: asp.net-mvc-3 controller query-string guid

注意:已编辑添加模型

问题:查询字符串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”具有ScannerUserId的指南

“用户B”(来自查询字符串)具有ScannedCodeId的指南

以下是模型:

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

这是Create:

上的控制器部分
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);
    }

如何将查询字符串中的guid放入note.ScannedCodeId,以便db.SaveChanges不会爆炸?

另外,感谢您阅读这篇文章以及您可以做的任何事情来帮助您。

2 个答案:

答案 0 :(得分:1)

我相信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.HiddenFor HTml帮助方法将其包含在表单中。然后,当您提交表单时,您将在viewmode中获取它,这是您的HttpPost Create方法的参数

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

答案 1 :(得分:0)

允许使用类型Guid而不是Int类型所需的更改,Shyju给了我答案。谢谢!