小编Ami*_*ila的帖子

简单发布到Web Api

我正在尝试使用web api发布帖子请求.以下是我的api控制器.

public class WebsController : ApiController
{
    [HttpPost]
    public void PostOne(string id)
    {
    }

    [HttpPost]
    public void PostTwo(Temp id)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经改变了webapi路线以考虑行动.Temp模型看起来像这样.

public class Temp
{
    public string Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的观点看起来像这样

@using (Ajax.BeginForm(new AjaxOptions
{
    Url = "/api/webs/postone",
    HttpMethod = "post"
}))
{
    <input name="id" id="id" value="2" />
    <input type="submit" value="submit" />
}
Run Code Online (Sandbox Code Playgroud)

除非我将[FromBody]属性放在参数前面,否则上面的代码根本不适用于postone.

[HttpPost]
public void PostOne([FromBody]string id)
{
}
Run Code Online (Sandbox Code Playgroud)

然后它命中动作,但id仍为null.它不会填充文本框中的值.

但是,如果我改变UrlAjax.BeginFormposttwo采取何种模式Temp,它很好地工作和Id领域在文本框中得到应有的价值.

任何人都可以请解释一下这种情况发生的原因以及如何将简单的值发布到网络API动作中?我的意思是,为什么它可以绑定复杂类型而不是简单类型.

c# http-post asp.net-mvc-4 asp.net-web-api

69
推荐指数
1
解决办法
14万
查看次数

mvc4 url​​验证

在试图找到两天的答案后,我在这里写这个问题.

基本上这是发生了什么.

我在viewmodel中有一个属性,如下所示

[Required(ErrorMessage = "Required Field")]
[Url(ErrorMessage="Please enter a valid url")]
[DisplayName("Website")]
public string web { get; set; }
Run Code Online (Sandbox Code Playgroud)

在视图中,我有这个

@Html.EditorFor(model => model.web, new { AutoCompleteType = "Disabled", autocomplete = "off" })
Run Code Online (Sandbox Code Playgroud)

现在的问题在于如何在客户端验证此字段的输入文本.该字段必须始终具有协议前缀,否则将变为无效.

我能解决这个问题的最佳方法是什么?

非常感谢

unobtrusive-validation asp.net-mvc-4 jquery-validation-engine

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

EntityFramework 5.0中的基类/实体

我在Database First方法中使用Entity Framework 5,我正在使用edmx文件.

我的大多数实体都有6个常见字段.像场CreatedAt,CreatedBy等等.现在,我实现一些功能只能应用于扩展IQueryable那些有共同的领域实体.但是当我实现扩展方法时,它可以被任何类型IQueryable的类型T访问,我只能定义类型T应该总是一种类型.

所以,我认为我可以为具有公共字段的实体提供基类,并将类型T定义为该基类型.但是,我似乎无法做到这一点.

关于如何解决这个问题或者实现我上面解释过的任何想法?

c# asp.net-mvc ef-database-first asp.net-mvc-4 entity-framework-5

8
推荐指数
1
解决办法
6575
查看次数

将外部登录链接到现有用户

我是新手,Identity并试图通过观看https://channel9.msdn.com/Series/Customizing-ASPNET-Authentication-with-Identity中的视频来学习

在默认的ASP.Net MVC模板中,/Manage如果您已经登录,则可以将多个外部登录(google,facebook)链接到您的帐户(直通).

但是,如果用户首次使用他们的谷歌帐户登录我们的网站并从其注销,并在另一天尝试使用他们的Facebook帐户登录,该怎么办?假设他们的facebook和Google帐户都使用相同的电子邮件地址,则用户将无法登录该网站,因为默认模板不允许这样做UserManager.CreateAsync会失败.我知道他们可以更改他们的电子邮件和登录,但这将为同一个用户创建两个不同的帐户.

var info = await AuthenticationManager.GetExternalLoginInfoAsync();
if (info == null)
{
    return View("ExternalLoginFailure");
}
var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
var result = await UserManager.CreateAsync(user);
if (result.Succeeded)
{
    result = await UserManager.AddLoginAsync(user.Id, info.Login);
    if (result.Succeeded)
    {
        await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
        return RedirectToLocal(returnUrl);
    }
}
Run Code Online (Sandbox Code Playgroud)

我更改了代码,ExternalLoginConfirmation以便检查用户是否存在并向新外部提供商发布广告AspNetUserLogins.任何人都可以告诉我,如果这是正确的方法吗?或者如果有更好的方法.

if (ModelState.IsValid)
        {
            // Get the information about the user from …
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc oauth-2.0 asp.net-mvc-5 asp.net-identity-2

8
推荐指数
1
解决办法
2228
查看次数

如何使用 docker-compose 启动 CosmosDB 模拟器?

我在 Visual Studio 中有一个 docker-compose 项目,它启动 3 个服务。其中之一使用 cosmosdb。

我已按照https://hub.docker.com/r/microsoft/azure-cosmosdb-emulator/上的说明在docker 容器中启动模拟器并且它工作正常。

但现在我想通过 docker-compose 文件启动并运行它。以下是我目前的配置。

version: '3.4'

services:
  gateway:        
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
    image: ${DOCKER_REGISTRY-}gateway
    ports:
      - "7000:80"
    depends_on:
      - servicea
      - serviceb
    build:
      context: .\ApiGateways\IAGTO.Fenix.ApiGateway
      dockerfile: Dockerfile

  servicea:
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
    image: ${DOCKER_REGISTRY-}servicea
    depends_on: 
      - email.db
    build:
      context: .\Services\ServiceA
      dockerfile: Dockerfile

  serviceb:
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
    image: ${DOCKER_REGISTRY-}serviceb
    build:
      context: .\Services\ServiceB
      dockerfile: Dockerfile

  email.db:
    image: microsoft/azure-cosmosdb-emulator
    container_name: cosmosdb-emulator
    ports:
      - "8081:8081"
Run Code Online (Sandbox Code Playgroud)

我运行时可以看到容器正在运行 docker container list 在此处输入图片说明

但是对https://localhost:8081/_explorer/index.html 的请求失败了。

对此非常感谢的任何帮助

visual-studio docker .net-core docker-compose azure-cosmosdb-sqlapi

6
推荐指数
3
解决办法
1819
查看次数

EF 5条件映射

我在我的MVC应用程序中使用EF 5数据库第一种方法.我的所有表都使用一个名为Deleted的字段,这是一个标记记录被删除的布尔字段.

我试图摆脱每次查询我的数据库时必须检查Deleted == false的要求.这种非常简单的方法是在edmx文件中使用条件映射,其中EF始终返回未删除的数据.这一切都很好.

但是,这个条件映射的问题是,当我想允许用户从地址簿中删除例如地址的某些记录时,我无法访问EF中的删除字段,因为我在条件映射中使用它,因此我必须寻找另一个允许用户删除记录的选项.

我想的方法是创建一个处理删除查询的存储过程,并在我想要删除记录时调用它.

有没有更好的方法呢?是否可以使删除字段可访问,即使它在条件映射中使用?

c# entity-framework asp.net-mvc-4

4
推荐指数
1
解决办法
2771
查看次数

如何隐藏web api 2中的元数据,odata

MapODataServiceRoute在我的用途中定义了odata路线WebApiConfig.

config.Routes.MapODataServiceRoute("CompanyoOdata", "odata", GetImplicitEdm(config));

private static IEdmModel GetImplicitEdm(HttpConfiguration config)
    {
        ODataModelBuilder builder = new ODataConventionModelBuilder(config, true);
        builder.EntitySet<Company>("Company");
        builder.EntitySet<Photo>("Photos");
        builder.EntitySet<Country>("Country");
        return builder.GetEdmModel();
    }
Run Code Online (Sandbox Code Playgroud)

数据服务工作得很好.但我想做的事情很少.

我不想暴露我的元数据或关联,因为我在内部使用它并且不需要元数据.如何限制对这些信息的访问(即限制访问http://www.sample.com/odata/#metadatahttp://www.sample.com/odata/ $ metadata)

其次,我想忽略序列化的一些属性.我找到了两种方法.

  1. 使用数据协定和标记[DataMember]属性或[IgnoreDataMember]属性的属性
  2. 在构建模型时使用Ignore方法EntitySet

我不能使用第一种方法,因为我正在使用数据库第一种方法来实现实体框架,因此无法使用属性来装饰实体.我以为我可以通过使用来实现这一点MetaDataType,但它似乎只适用于DataAnnotations.

我成功使用了第二种方法,但是你不能在ignore方法中传递多个属性.必须对我需要忽略的个人财产这样做,这有点单调乏味.还有另一种方法吗?

任何帮助真的很感激.

asp.net asp.net-mvc odata asp.net-web-api asp.net-web-api2

4
推荐指数
1
解决办法
3060
查看次数