小编Joh*_*ohn的帖子

如何使用ASP.Net MVC删除项目

在MVC中删除项目的最佳方法是什么?我有一个项目清单.每行都包含一个"删除"链接.我希望删除链接提示确认,然后从数据存储区中删除该项目并使用新数据刷新页面.

这是我的观看代码:

            <%: Ajax.ActionLink(
                "Delete"
                ,"Delete"
                , new { id=item.FooId}
                , new AjaxOptions()
                { 
                    Confirm="Are you sure that you want to delete this item?"
                    , HttpMethod = "post"} ) %>
Run Code Online (Sandbox Code Playgroud)

这是我的控制器代码:

    [HttpPost]
    public ActionResult Delete(int id)
    {
        try
        {
            var success = FooService.Deletefoo(id);
            return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }
    }
Run Code Online (Sandbox Code Playgroud)

该记录正在删除,但页面不刷新.我唯一能想到的是RedirectToAction只适用于不同的页面,而不适用于同一页面.

如何刷新页面?

asp.net-mvc

6
推荐指数
1
解决办法
7697
查看次数

在Web API中,当一个方法包含可空值类型作为参数时,如何重载Get

UPDATE

我最初的假设是可选参数是问题的原因.这似乎是不正确的.相反,当其中一个方法包含某些参数的可空值类型(例如int?)时,它似乎是多个动作方法的问题.

我正在使用Visual Studio 2012 RC,我刚刚开始使用Web API.我遇到了一个问题,并收到错误"在控制器上找不到与请求相匹配的'Bars'."

我有一个Bars控制器.它有一个Get()方法,它接受可选参数.

public IEnumerable<string> Get(string h, string w = "defaultWorld", int? z=null)
{
    if (z != 0)
        return new string[] { h, w, "this is z: " + z.ToString() };
    else
       return new string[] { h, w };
}
Run Code Online (Sandbox Code Playgroud)

所以,我用以下网址测试它

  • / API /棒ΔH=你好
  • / API /条?H =你好&W =世界
  • / API /条?H =你好&W =世界&Z = 15

它适用于所有三个.

然后,我去添加另一个Get()方法,这次使用一个id参数

 public string Get(int id)
 {
     return "value";
 }
Run Code Online (Sandbox Code Playgroud)

我再次测试网址.这个时间/ api/bars?h =你好&w = world和api/bars?h =你好失败.错误消息"在控制器'Bar'上找不到与请求匹配的操作."

出于某种原因,这两种方法并不能很好地协同工作.如果我删除Get(int …

asp.net-web-api visual-studio-2012

6
推荐指数
1
解决办法
9721
查看次数

在ASP.Net Web API中,如何更改特定Controller或Action的默认格式化程序

我们运行了一个Web API站点,它将用于多种用途:

  1. 在开发客户端中,例如我们构建的iPhone应用程序,主要使用JSON.
  2. 普通用户通过RSS客户端,将其添加到他们喜欢的RSS阅读器(例如Flipboard).

我基于此链接创建了一个自定义RSS 2.0,并在WebApiConfig中进行了配置

public static void Register(HttpConfiguration config)
{
    config.Formatters.Add(new SyndicationMediaTypeFormatter());
Run Code Online (Sandbox Code Playgroud)

它接受application/rss + xml和application/atom + xml的接受头.

用户通常将RSS提要粘贴到他们的rss客户端,而不知道任何关于标题的内容 - 所以我需要有一些默认的RSS路由.

但是,这是棕色字段开发,json供稿已经在使用中,目前作为默认值,我无法在整个站点中更改默认格式化程序,而不会对现有开发人员客户端产生负面影响.

我可以将其作为特定控制器的默认格式化程序,但不能作为整个站点的默认格式化程序吗?

asp.net-web-api mediatypeformatter

6
推荐指数
1
解决办法
1230
查看次数

Linq是否在2.1 Alpha版本中出现了NHibernate?

所以nHibernate 2.1 Alpha几天前问世了,但是sourceforge上的公告并未提及其他功能.特别是,它没有提到是否包括LINQ.我知道我已经读过LINQ将成为2.1的一部分,但那是6个月前.有人知道LINQ是2.1还是新功能?在官方网站上没有关于2.1 alpha功能的文档.

linq nhibernate linq-to-nhibernate

5
推荐指数
1
解决办法
1241
查看次数

在TDD和DDD中,如何处理假货中的只读属性?

创建假货时如何处理只读字段?

背景

我正处于使用ASP.Net MVC的初学阶段,我正在使用Steven Sanderson的体育用品店和Scott Gu的书呆子晚餐作为例子.我刚刚遇到的一个小问题是如何在做假货时使用只读属性.我正在使用LINQToSQL.

我的界面是:

public interface IPersonRespository
{   
    Person GetPerson(int id);
}
Run Code Online (Sandbox Code Playgroud)

而我的假装变成了

public class FakePersonRepository
{
    public Person GetPerson(int id)
    {
        return new Person {id="EMP12345", name="John Doe", age=47, ssn=123-45-6789, totalDrWhoEpisodesWatched=42};
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的问题.字段id,ssn和totalDrWhoEpisodesWatched是只读的,因此上面的代码实际上不起作用.但是,我不知道如何创建假新人并设置只读属性.我确信有一个解决方案,但我在搜索中还没有遇到过它.

更新:继承+属性隐藏为潜在的解决方案?

我还没有决定解决这个问题.我不喜欢为了创造假货而修改我的Domain类的概念.对我来说,为了进行测试而向域类添加标记是一种额外的耦合形式 - 与测试的实现相结合.我现在正在研究另一种可能性,即创建一个继承自Person的FakePerson类,但使用新的读写属性隐藏属性.

public class FakePerson: Person
{
    public new int age { get; set; }
    public new string ssn { get; set; }
    public new int totalDrWhoEpisodesWatched { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,这个解决方案就是我的倾向.它确实打破了Liskov替换原则,但是这并没有在测试项目中给我带来太多麻烦.我很高兴听到任何批评和/或反馈作为解决方案.

获奖者:模拟框架

Moq似乎完成了这项工作.事实上,我通过继承隐藏属性的最后一个解决方案确实有效,但是通过使用Moq,我获得了一组更易于维护的标准化功能.我假设其他模拟框架具有此功能,但我没有检查.据说Moq开始模拟写作更直接,我现在肯定是这样.

tdd asp.net-mvc domain-driven-design nerddinner

5
推荐指数
1
解决办法
1449
查看次数

在您的体系结构中,如何将URL与数据库层和业务对象层分离

背景

我们的网站上有一些链接,其格式如下:

http://oursite.com/books/c_sharp_in_depth_12345.

为了解决这个问题,我们使用了一个简单的属性Url:

public class Book
{
    public string Url { get; set;}
}
Run Code Online (Sandbox Code Playgroud)

基本上,URL来自我们网站的域名,网站的一部分(即书籍),页面名称和标识资源的唯一ID.完整的URL存储在数据库中.

我们不喜欢我们的数据库存储节名称这一事实.这是Web图层属性的属性,而不是本书的属性.数据库不应该依赖于Web层.

因此,我们从URL中删除该部分并获取以下内容:

public class Book
{
    public string UrlWithoutSection { get; set;}
}
Run Code Online (Sandbox Code Playgroud)

好的,适用于此URL.但是后来我们公司的SEO沙皇说我们的网址是错误的,如果我们重新编写这样的网址,谷歌,我们唯一的真爱,只会爱我们:

http://oursite.com/programming-books/c-sharp-in-depth-12345

呃,我以为我们已经删除了对Web层的数据库依赖,但我们没有.事实证明,我们已经删除了对该部分的依赖性,但URL的格式仍然存在于数据库中.我们通过将URL抽象为对象来解决此问题:

public class OurUrl 
{
    public string title { get; set; }
    public string id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

很酷,现在对web层的依赖性消失了.哦,这次我们的首席执行官来找我们.我们刚刚买了一家新公司,现在我们正在销售杂志.呃,好吗?杂志网址将如下所示:

http://oursite.com/magazines/computers/stack-overflow-the-magazine/2012/01/01/12345

好的,没问题,只需创建另一个对象.

public class OurMagazineUrl : OurUrl
{
    public DateTime PublishedDate { get; set; }

    // Magazine enum will have to be created.
    public MagazineType …
Run Code Online (Sandbox Code Playgroud)

c# architecture url dynamic expando

5
推荐指数
1
解决办法
466
查看次数

测试服务是功能测试还是集成测试

我们有一个提供功能的 .Net 组件。我们有一个 Restful Web API 服务,世界将用它来调用该功能。我们编写了使用 OWIN 调用 Web API 控制器的测试。

过去,我一直将这些称为“集成测试”,因为服务是一个单独的组件。然而,另一位我尊敬的开发人员告诉我,这不是集成测试,而是“功能测试”。

我查看了功能测试的定义和集成测试的定义,对于我来说,对于 RESTful 服务测试的测试应该如何称呼,两者都不是明显的赢家。

是集成还是功能?是否有任何权威来源可以用来明确回答这个问题(因为我不希望我的问题因“征求辩论”而被关闭)?

testing integration-testing functional-testing

5
推荐指数
1
解决办法
904
查看次数

ASP.Net Control ID对SEO和页面大小有害吗?

ASP.Net控件(例如asp:Label)生成凌乱的html id(例如ct100_ct100_Yabba_Dabba_Doo_FinallyTheRealId).是的,他们很难看,但今天有人告诉我他们也是:

  1. 对SEO不友好
  2. 增加页面大小

我半信半疑,一半不相信.我知道某些id名称(例如"header")是搜索引擎用来生成元信息的关键字,但我更怀疑id ="author"的跨度确实会影响SEO.我愿意承认我错了.

在第2点),我至少90%持怀疑态度.大多数页面大小不是html字符,我真的想知道100个更长的ID是否会为页面大小增加1kb.

我可以采用两种方法中的一种.你会采取哪种方法?

方法1)

<asp:Label id="lblAuthor" runat="server"></asp:Label>
Run Code Online (Sandbox Code Playgroud)

代码背后

protected void Page_Load(object sender, EventArgs e)
{
   lblAuthor.Text = "Superman";
Run Code Online (Sandbox Code Playgroud)

方法2)

<span id="author"><%# Eval("Author") %></span>
Run Code Online (Sandbox Code Playgroud)

代码背后

public string Author { get; private set; }
protected void Page_Load(object sender, EventArgs e)
{
       Author = "Superman";
Run Code Online (Sandbox Code Playgroud)

一方面,1)不会产生令人讨厌的ID.另一方面,我总是讨厌asp.net web表单中的无类字符串,并尽可能避免使用它们.此外,如果一个页面有30多个元素,我最终会有30个页面属性,这让我感到不安.(旁注:喜欢模型在MVC模式中的工作原理).

我们正在使用.Net 3.5.

你的想法是什么?

谢谢.

c# asp.net seo webforms

3
推荐指数
1
解决办法
447
查看次数

如何使用嵌套T创建通用方法?

我有一个通用的扩展方法

public static IList<T> Replace<T>(this IList<T> source, Ilist<T> newList) where T:IStateful
Run Code Online (Sandbox Code Playgroud)

我打电话使用

myStatefulSetOfStuff = myStatefulSetOfStuff.Replace(GetNewSetOfStuff());
Run Code Online (Sandbox Code Playgroud)

但我意识到,我的方法适用于实现ICollection的所有集合,因此我将其更改为

public static ICollection<T> Replace<T>(this ICollection<T> source, ICollection<T> newList) where T:IStateful
Run Code Online (Sandbox Code Playgroud)

但是,现在该方法返回IColllection,这迫使我将调用写为:

myStatefulSetOfStuff = myStatefulSetOfStuff.Replace(GetNewSetOfStuff()).ToList();
Run Code Online (Sandbox Code Playgroud)

如何重新编写我的方法,以便我不需要.ToList()打电话?

编辑:有些混乱,所以我会尝试清理它.我有一份清单.我想用新列表在该列表上执行操作.没问题.我想出了如何使用扩展方法返回List.

但是我意识到,嘿,Replace()中的实际代码并不特定于Lists,它可以应用于任何集合.所以我修改了Replace以返回ICollection.这会强制调用方法看起来像

var newStuff = left.Replace(right).ToList()
Run Code Online (Sandbox Code Playgroud)

要么

var newStuff = left.Replace(right).ToArray()
Run Code Online (Sandbox Code Playgroud)

等等

但我不想说ToList,ToArray等,我希望该方法只是从源对象推断出正确的返回类型.所以我可以说

var newStuff = left.Replace(right);
Run Code Online (Sandbox Code Playgroud)

和newStuff的类型与左边​​相同.右边也是同一类型.

c# generics extension-methods

3
推荐指数
1
解决办法
262
查看次数

这个ASP.Net和Fiddler的例子有什么问题?

我正在使用Visual Studio 2012 RC.我使用默认路由并具有以下Web API控制器:

public class FooController : ApiController
{
    // GET api/foo
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/foo/5
    public string Get(int id)
    {
        return "value";
    }

    // POST api/foo
    public string Post(string abc)
    {
        Console.WriteLine("value: {0}", abc);
        return "foo" + abc;
    }

    // PUT api/foo/5
    public void Put(int id, string value)
    {
    }

    // DELETE api/foo/5
    public void Delete(int id)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

我想在Fiddler做一个简单的POST测试,所以我有

请求标头
用户代理:Fiddler
内容类型:application/json

请求正文
{"abc":"def"} …

fiddler asp.net-web-api

3
推荐指数
1
解决办法
2477
查看次数