注意:已编辑以添加型号
问题是:一个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给了我答案。非常感谢。