简而言之:如何成功编辑数据库条目而无需在编辑视图中包含模型的每个字段?
更新
所以我在DB(文章)中有一个项目.我想编辑一篇文章.我编辑的文章有很多属性(Id,CreatedBy,DateCreated,Title,Body).其中一些属性永远不需要更改(如Id,CreatedBy,DateCreated).因此,在我的编辑视图中,我只想要可以更改的字段的输入字段(如标题,正文).当我像这样实现编辑视图时,模型绑定失败.我没有提供输入的任何字段都设置为某个"默认"值(如DateCreated设置为01/01/0001 12:00:00 am).如果我确实为每个字段提供输入,一切正常,文章按预期编辑.我不知道是否正确地说"模型绑定失败"是必要的,如果"如果在编辑视图中没有为它们提供输入字段,则系统会填充包含不正确数据的字段".
如何以这样的方式创建编辑视图:我只需要为可以/需要编辑的字段提供输入字段,以便在调用Controller中的Edit方法时,正确填充DateCreated等字段,而不设置某些默认值,不正确的值?这是我目前的编辑方法:
[HttpPost]
public ActionResult Edit(Article article)
{
// Get a list of categories for dropdownlist
ViewBag.Categories = GetDropDownList();
if (article.CreatedBy == (string)CurrentSession.SamAccountName || (bool)CurrentSession.IsAdmin)
{
if (ModelState.IsValid)
{
article.LastUpdatedBy = MyHelpers.SessionBag.Current.SamAccountName;
article.LastUpdated = DateTime.Now;
article.Body = Sanitizer.GetSafeHtmlFragment(article.Body);
_db.Entry(article).State = EntityState.Modified;
_db.SaveChanges();
return RedirectToAction("Index", "Home");
}
return View(article);
}
// User not allowed to edit
return RedirectToAction("Index", "Home");
}
Run Code Online (Sandbox Code Playgroud)
编辑视图是否有帮助:
. . .
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Article</legend>
<p>
<input type="submit" value="Save" …Run Code Online (Sandbox Code Playgroud) TL; DR:如何在Visual Studio 2017中包含tsconfig.json文件,并且仍然像默认情况下那样使用JavaScript intellisense工作,为您自己的代码和第三方库提供代码提示?它是否被剔除,或者我只是需要更好地了解它是如何工作的?
就像jQuery一样,我希望通过intellisense在JavaScript和html文件中无处不在地访问我自己的JavaScript命名空间.如何实现这一目标?
编辑3:
我在developercommunity.visualstudio.com上报告了这个问题.请考虑对该问题进行投票,以吸引微软的更多关注.
编辑2:
目前"解决方案"是Resharper,它提供了人们所期望的直接开箱即用.但对于它自己提供的Visual Studio市场来说,以每年299美元/用户的价格出售它并不是很理想.
编辑1:
如果我对Visual Studio中JavaScript智能感知的期望不准确,下面是我期望它如何运作的一个人为设想的例子.
说我在./Scripts文件夹中创建三个打字稿文件,我们会打电话给他们A.ts,B.ts和C.ts.每个都包含自己的命名空间:
A.ts
namespace A {
export function f1(s: string) {
return s;
}
}
Run Code Online (Sandbox Code Playgroud)
B.ts
namespace B {
export function f1(n: number) {
return n;
}
}
Run Code Online (Sandbox Code Playgroud)
C.ts
namespace C {
export function f1(b: boolean) {
return b;
}
}
Run Code Online (Sandbox Code Playgroud)
在这个时间点,人们可能期望能够开始看到他们新创建的命名空间的智能感知,实际上,在A.ts,B.ts和C.ts中,您开始看到这些命名空间的智能感知.凉.
不幸的是,这并没有转移到其他地方,比如/Home/Index.cshtml.Index.cshtml对A,B或C名称空间一无所知.此外,.js文件对这些命名空间一无所知,因此需要各自的TypeScript声明(.d.ts)文件.
因此,我们将继续将我们的tsconfig.json文件添加到项目的根目录,并像上面一样对其进行配置.如果我们对其中一个.ts文件执行编辑并保存,则会触发将相应的.d.ts文件编译到我们的./Scripts/out文件夹中.我们现在在Index.cshtml和.js文件中获得intellisense吗?...没有.
现在您可能会认为这些文件需要包含在项目中,以便Visual Studio为智能感知提取它们(它们在创建时被排除).所以你将它们包含在项目中.智能感知?没有.jQuery intellisense?不.也许他们需要与您要使用它们的文件位于同一目录中?.....的种类?在很多场合,我遇到了像这样不一致的intellisense:
不知怎的,我们在我们的C3.js中的'A'命名空间得到了智能感知(注意:一个JavaScript文件),但没有其他的.什么?
也许你认为你在正确的轨道上并且你已经在智能感知引擎上取得了小小的胜利.但是,然后重新启动Visual Studio实例并...
等等....我刚刚对'A'命名空间进行了智能感知.发生了什么!?
我不知道.但是在搞砸了一下后,我尝试在.js文件的顶部放置一个import语句,突然间intellisense开始为导入的文件/模块启动.好哇!
甚至在Index.cshtml中,我开始接收导入的命名空间的intellisense.
我用import语句关闭.js文件的那一刻,突然间我在Index.cshtml中丢失了它们的intellisense.等等...什么?与JavaScript文件不同,我无法编写import语句来接收它们的intellisense: …
javascript intellisense typescript tsconfig visual-studio-2017
我正在使用Windows身份验证创建Intranet站点.
也许我不是最好的方式,但是我试图通过调用一个包含Authorize action过滤器的控制器方法来加载部分视图,这样只有经过授权的人才能看到页面的那一部分.比如说,我想在页面上加载管理员工具,但前提是登录的个人是管理员.
所以在index.cshtml页面上我可能有类似的东西:
@Html.Action("LoadAdminTools","ControllerName")
Run Code Online (Sandbox Code Playgroud)
Controller将包含以下代码:
[Authorize(Roles="Admins")]
public ActionResult LoadAdminTools()
{
return PartialView("_AdminToolsPartialView");
}
Run Code Online (Sandbox Code Playgroud)
然后,包含管理控件(或其他)的部分视图将呈现给页面 - 仅当登录用户是Admins角色的一部分时.
我遇到的"问题"是,如果登录的人无权加载部分视图,浏览器会弹出登录对话框,询问用户的凭据.关闭对话框而不输入任何凭据会导致预期的结果 - 部分视图不会在页面的其余部分加载时加载.很酷,但很烦人.输入错误的凭据,您会收到401错误 - 也正如预期的那样.
如果有帮助:在IIS中,禁用匿名身份验证,启用 Windows身份验证.在"安全设置 - 本地Intranet区域"下的"Internet选项"中选择"使用当前用户名和密码自动登录".
我的问题是:有没有办法在没有浏览器要求用户登录的情况下使用[授权]操作过滤器加载部分视图(或者真的做任何事情)?只需要获取当前登录的凭据,检查它们是否符合操作过滤器,如果有,则加载部分视图,如果没有,则不要.如果没有,是否有更好的方式来实现我想在这里完成的工作?
UPDATE
美丽.我读了你发布的问题的解决方案,Mystere Man,在Controller的文件夹中创建了一个名为IntranetAuthorizeAttribute.cs的新类,抛出了代码:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class IntranetAuthorizeAttribute : System.Web.Mvc.AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(System.Web.Mvc.AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.IsAuthenticated)
{
filterContext.Result = new System.Web.Mvc.HttpStatusCodeResult(403);
}
else
{
base.HandleUnauthorizedRequest(filterContext);
}
}
}
Run Code Online (Sandbox Code Playgroud)
用我的新IntranetAuthorize过滤器替换了Authorize过滤器:
[IntranetAuthorize(Roles="Admins")]
public ActionResult LoadAdminTools()
{ …Run Code Online (Sandbox Code Playgroud)