8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

为什么尽管模型中的图片属性已被分配,但 modelstate.isvalid 始终为 false

Sedat Kapanoglu 3月前

206 0

我正在开发一个 razor pages 项目。我有一个员工模型,它有一个字节数组类型的图片属性。尽管当我检查 modelstate.isvalid 时图片被分配了字节数组,但 emp.pictur...

我正在开发一个 razor pages 项目。我有一个员工模型,它有一个字节数组类型的图片属性。尽管我检查时图片被分配了字节数组,但 modelstate.isvalid , emp.picture 这里是我的员工模型和相关代码:

public class Employee
{
    public int Id { get; set; }

    [Required(ErrorMessage = "Please enter first name")]
    [DisplayName("First Name")]
    public string FirstName { get; set; }

    [Required(ErrorMessage = "Please enter last name")]
    [DisplayName("Last Name")]
    public string LastName { get; set; }


    [Required(ErrorMessage = "Please enter age")]
    [Range(20, 60, ErrorMessage = "Valid age is between 20 to 60")]
    public int Age { get; set; }

    [Required(ErrorMessage = "Please select joining date")]
    [DisplayName("Joining Date")]
    [DataType(DataType.Date)]
    public DateTime JoiningDate { get; set; }

    [Required(ErrorMessage = "Please enter email address")]
    [EmailAddress]
    public string Email { get; set; }

    [Required(ErrorMessage = "Please enter phone number")]
    [DisplayName ("Phone No")]
    [Phone]
  
    public string PhoneNo { get; set; }
    public byte[] Picture { get; set; }

    public bool Gender { get; set; }
    public bool Active { get; set; } = true;

    [Required(ErrorMessage = "Please select a Department")]
    public int DepartmentId { get; set; }
    public Department? Department { get; set; }

    [NotMapped]
    public IFormFile ImageFile { get; set; }
}

    public async Task<IActionResult> OnPostAsync()
    {
       byte[] bytes;
        if (emp.ImageFile != null)
        {
            using (Stream fs = emp.ImageFile.OpenReadStream())
            {
                using (BinaryReader br = new BinaryReader(fs))
                {
                    bytes = br.ReadBytes((Int32)fs.Length);

                }
            }
            emp.Picture = bytes;
        }
      
        if (!ModelState.IsValid)
        {
            return Page();
        }
       
        _db.Employees.Add(emp);
        await _db.SaveChangesAsync();
        TempData["Success"] = "Employee created successfully....";
        return RedirectToPage("/Employees/Index");
    }
}

我希望那张图片应该有一个值,但我不知道为什么它没有值。

帖子版权声明 1、本帖标题:为什么尽管模型中的图片属性已被分配,但 modelstate.isvalid 始终为 false
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Sedat Kapanoglu在本站《asp.net》版块原创发布, 转载请注明出处!
最新回复 (0)
  • KKU 3月前 0 只看Ta
    引用 2

    模型绑定发生在方法中的代码 OnPostAsync 执行之前,并且 ModelState 不会因您为属性分配值而更新 Picture 。 您可以 ModelState.Remove 在满意地为分配值后使用该方法删除无效条目 Picture

    public async Task<IActionResult> OnPostAsync()
    {
        byte[] bytes;
        if (emp.ImageFile != null)
        {
            using (Stream fs = emp.ImageFile.OpenReadStream())
            {
                using (BinaryReader br = new BinaryReader(fs))
                {
                    bytes = br.ReadBytes((Int32)fs.Length);
    
                }
            }
            emp.Picture = bytes;
            ModelState.Remove("emp.Picture");
        }
          
        if (!ModelState.IsValid)
        {
            return Page();
        }
           
        _db.Employees.Add(emp);
        await _db.SaveChangesAsync();
        TempData["Success"] = "Employee created successfully....";
        return RedirectToPage("/Employees/Index");
    }
    
  • dlev 3月前 0 只看Ta
    引用 3

    有(来源):void f(); // 声明 (1)void f(void); // 带原型的声明 (2)void f() { ... } // 定义 (3)void f(void) { ... } // 带原型的定义...

    有( 来源 ):

    void f();            // declaration (1)
    void f(void);        // declaration with prototype (2)
    void f() { ... }     // definition (3)
    void f(void) { ... } // definition with prototype (4)
    

    3 和 4 之间有什么区别? 来源没有解释这种区别,对我来说 4 看起来是多余的。

  • 出于某种原因,我尝试在 Fortran 中运行 OpenGL 3.3。我无法调用 glGenBuffers()。尝试使用 glGenBuffers 函数编译程序时,出现 lnk2019 错误。

    出于某种原因,我尝试在 Fortran 中运行 OpenGL 3.3。我无法调用 glGenBuffers() .

    尝试使用该 glGenBuffers 函数编译程序时,出现 lnk2019 错误。该 glewInit() 函数返回 0,因此 GLEW 已初始化。这可能与什么有关?
    我使用GLFW,尝试了静态GLEW库和动态GLEW库。我编写了该函数的接口如下:

    subroutine glGenBuffer(n, buffers) bind(c, NAME = "glGenBuffer")
    !DEC$ ATTRIBUTES DLLIMPORT :: glGenBuffers
    import :: GLsizei,GLuint, c_ptr
        integer(GLsizei)    :: n
        integer(GLuint) :: buffers
    endsubroutine 
    

    glewExperimental的描述:

    integer(GLboolean), bind(C, name="glewExperimental") :: glewExperimental
    

    代码:

        if(glfwInit() .eq. 0) stop -1
        call glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3)
        call glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR,3)
        call glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE)  
        call glfwWindowHint(GLFW_RESIZABLE, 0)
    
        Monitor = glfwGetPrimaryMonitor() 
        call glfwGetMonitorPhysicalSize(Monitor,mmx,mmy)
     
        GL_contex = glfwCreateWindow(1000, 480, name, C_NULL_PTR, C_NULL_PTR)
        
        if(.not. C_ASSOCIATED(GL_contex)) then
        call glfwTerminate()
        stop -1
        endif
            
        glewExperimental = 1
        if(glewInit() .ne. 0) then
           print*, 'GLEW eror'
           stop -1    
        endif
       
        call  glfwGetFramebufferSize(GL_contex, width, height)
        call glGenBuffer(1,VBO)
    

    先感谢您。

  • Hamz 3月前 0 只看Ta
    引用 5

    我真的不明白你想问什么,是为什么 init 函数失败了吗(假设 1 是失败)?如果是的话

  • chi 3月前 0 只看Ta
    引用 6

    @Useless 它与 C23 完全不同。(我不喜欢该修订版的几个原因之一。虽然大部分确实已经过时,但无原型声明

  • (3) 和 (4) 创建的函数是相同的 — 两者都没有参数,编译器可能会为它们生成相同的代码。然而,在 C 2018(目前仍是标准)中,附加到函数名称的类型信息不同,这可能会影响对函数的调用。C 2024 预计将改变这一点,使 (3) 等同于 (4)。

    假设没有其他可见的声明 f 修改该声明,则对 f (4) 中声明的调用将受到 C 2018 6.5.2.2 2 中的此约束的约束:

    如果表示被调用函数的表达式具有包含原型的类型,则参数的数量应与参数的数量一致……

    C 标准要求诊断约束违规;如果程序包含约束违规,编译器必须生成诊断消息。相反,对 f (3) 中声明的调用不受该约束,并且编译器不需要生成诊断消息(尽管它可以生成)。

    使用 C 2018 6.5.2.2 6 中的规则 f 分析对的调用

    如果表示被调用函数的表达式具有不包含原型的类型,...

    using 6.5.2.2 7 f 的调用

    如果表示被调用函数的表达式具有包含原型的类型,...

    然而,通常不会产生任何后果,因为这些段落仅指定了两件事:

    1. p9

    2. p10

    如果没有参数,则 2. 不适用。如果有参数,则两种情况下的行为都是未定义的,并且我认为参数的不同转换不会引起任何有意义的行为差异。

    补充

    有趣的是,尽管标准不要求编译器在调用 (3) 中的函数时使用参数进行诊断,但它确实要求编译器在重新声明该函数时使用参数进行诊断,例如 void f(int x); 。C 6.7 2 有此约束,要求诊断:

    同一范围内引用同一对象或函数的所有声明都应指定兼容类型。

    6.7.6.3 15 中兼容函数类型的规范规定:

    ...如果一种类型具有参数类型列表,而另一种类型由包含(可能为空的)标识符列表的函数定义指定,则两者的参数数量应一致,...

    由于 void f(int x) 具有参数类型列表,并且 void f() {} 包含空标识符列表,因此它们必须兼容,参数数量必须一致。它们不一致,因此它们不兼容,因此必须诊断出约束违规。

    这似乎是标准的一个疏忽;由于这个约束迫使编译器保留函数定义中参数数量的知识,即使它使用标识符列表而不是原型,标准也可能要求编译器诊断参数数量不正确的调用,而无需编译器保留有关该函数的任何其他信息。

    但是,这只在函数定义在调用时可见的情况下才有用,而这种情况通常并非如此,因为函数可能在另一个翻译单元中定义,或者稍后在同一个单元中定义。所以可能不是一个需要涵盖的重要情况。尽管如此,它还是可以发现一些错误。

  • AbM 3月前 0 只看Ta
    引用 8

    您考虑过 6.7.6.3p14 吗?\'… 函数声明符中的空列表是该函数定义的一部分,表示该函数没有参数。...\'。

  • @IanAbbott:是的,那么这会带来什么后果呢?正如我所写的,该函数没有参数。 (3) 和 (4) 之间的区别在于与标识符 (函数名称) 关联的类型信息。标识符和函数是不同的东西。

  • M.Ob 3月前 0 只看Ta
    引用 10

    我以为 void f{) { } 会将定义的函数声明为没有参数,与 void f(void) { } 相同,但我错了。6.7.6.3p14 仅适用于函数定义本身,而不适用于函数定义在范围内且范围内没有其他包含原型的函数声明时调用时看到的函数声明。例如 void f() {} void g(void) { f(1); } 没有约束违反,但 void f(void); void f() {} void g(void) { f(1); } 有约束违反(因此需要诊断)。两者都有 UB。

  • Alec 3月前 0 只看Ta
    引用 11

    我可能无法提供最科学的答案,但这是我的尝试。

    对于初学者来说,定义 3 和 4 是相同的。然而,在更严肃的项目中,不仅当前的信息很重要(并且需要验证),缺失的信息也很重要。

    所以底线是这样的:

    • 定义 4 明确指出程序员明确决定使用没有参数的函数;
    • 定义 3 没有明确说明任何内容;可能是函数必须在没有形式参数的情况下运行,或者意味着程序员在编写形式参数的确切列表之前编写了函数主体,而忘记返回来完成该作业。

    更糟糕的是,如果局部变量与某些全局变量同名,编译器将在没有任何消息的情况下接受该函数 - 然后,过一段时间,你就会发现调试的乐趣。

    这就是为什么我总是喜欢把事情说清楚。如果缺少了什么(不明确),我知道我还有一些工作要做。


    一种“极端”的解释如下:

    • 函数3根本没有参数;
    • 函数4有一个参数,该参数指定没有参数。

    再次,同样的结论显而易见:功能 3 没有明确期望/需求。


    这种差异还有更隐蔽的方面,这对初学者来说更有害。不使用 \'void\' 作为参数列表 \'教导\' 初学者程序员 \'void\' 等同于 \'nothing\',或者恰恰相反 - \'nothing\' 与 \'void\' 相同。

    但是,您可以很容易地注意到,函数的返回类型也可以是“void”或“nothing”。但在这种情况下,“nothing”(作为函数的返回类型)不再表示“void”,而是实际上(从字面上)表示“int”。这又是一个有趣的调试活动和白发来源。

  • 引用 12

    我不同意。定义 3 非常清楚,尤其是对于在“严肃项目”中会遇到的经验丰富的 C 程序员来说。函数定义可能是错误的,因为“程序员 [...] 忘记返回以完成工作”是无关紧要的,因为问题是给定的定义的含义。另一方面,不,对于声明 1 和 2 的讨论并不同样有效。在迄今为止的所有 C 版本中(但在即将到来的下一个版本中),1 和 2 实际上在语义上是不同的。

  • @JohnBollinger,我撤销了错误的声明。请不要在这里讨论 1 和 2。真的已经有几十个主题了!;)

  • MAUI-WITH-SHARED-PROJ 当我创建“.NET MAUI Blazor 混合和 Web 应用程序”(新的 vs proj 模板)时,我无法发布该应用程序。错误消息:指定的 RuntimeIdentifier“win10-x...

    毛伊岛与共享项目
    当我创建“.NET MAUI Blazor 混合和 Web 应用程序”(新 vs proj 模板)时,我无法发布该应用程序。

    错误信息:无法识别指定的 RuntimeIdentifier“win10-x64”。

    ...\dotnet\sdk\9.0.100-preview.5.24307.3\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.FrameworkReferenceResolution.targets  
    

    我已阅读有关 RID 错误的信息并将其更改为 win-x64,但问题并未得到解决。

    MAUI 独立式
    当我创建单个项目“.NET MAUI Blazor Hybrid”时,我能够成功发布 Maui Windows 应用程序。如果我将共享项目添加到 MAUI-STANDALONE,我会收到相同的错误。

    毛伊岛与共享项目
    当我添加

    <RuntimeIdentifier>win-x64</RuntimeIdentifier>  
    

    对于这个项目我收到这个错误
    RuntimeIdentifier“win-x64”无效。

    \dotnet\packs\Microsoft.iOS.Sdk.net9.0_17.2\17.2.9639-net9-p5\targets\Xamarin.Shared.Sdk.targets
    

    以下是
    毛伊岛与共享项目

    <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup>
        <PublishDir>bin\Debug\net9.0-android\publish\</PublishDir>
        <PublishProtocol>FileSystem</PublishProtocol>
        <RuntimeIdentifier>win-x64</RuntimeIdentifier>
        <Platform>Any CPU</Platform>
        <Configuration>Debug</Configuration>
        <TargetFramework>net9.0-windows10.0.19041.0</TargetFramework>
        <PublishSingleFile>false</PublishSingleFile>
        <PublishReadyToRun>false</PublishReadyToRun>
        <SelfContained>True</SelfContained>
        <PublishAppxPackage>true</PublishAppxPackage>
        <AppxPackageDir>C:\Work\</AppxPackageDir>
      </PropertyGroup>
    </Project>
    

    以下是
    MAUI 独立式

    <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup>
        <PublishDir>bin\Debug\net9.0-android\publish\</PublishDir>
        <PublishProtocol>FileSystem</PublishProtocol>
        <RuntimeIdentifier>win10-x64</RuntimeIdentifier>
        <Platform>Any CPU</Platform>
        <Configuration>Debug</Configuration>
        <TargetFramework>net9.0-windows10.0.19041.0</TargetFramework>
        <PublishSingleFile>false</PublishSingleFile>
        <PublishReadyToRun>false</PublishReadyToRun>
        <SelfContained>True</SelfContained>
        <PublishAppxPackage>true</PublishAppxPackage>
        <AppxPackageDir>C:\Work\</AppxPackageDir>
      </PropertyGroup>
    </Project>
    
  • 我在使用 Log4NET 与 ASP.NET 7.0 结合使用时遇到了一个问题,即它无法写入我的日志文件,但是它可以创建日志文件并写入控制台。因此,我阅读了很多有关程序集引用的内容,

    我在使用 Log4NET 与 ASP.NET 7.0 结合使用时遇到了问题,它无法写入我的日志文件,但它会创建日志文件并写入控制台。因此,我阅读了大量有关程序集引用、log4net 布局模式等内容,但都无济于事。在 StartupBase 中,我通过传递 log4net.config 来配置 Log4Net。找到 log4net.config 后,我通过重命名对其进行了测试。重命名后,文件也发生了变化。因此,我认为找到了配置文件。

    启动基础

    public class StartUpBase
    {
       public ILog Logger { get; set;  }
    
       public void ConfigureServiceBase(IServiceCollection services)
       {
           var repo = LogManager.CreateRepository(
           Assembly.GetEntryAssembly(), typeof(log4net.Repository.Hierarchy.Hierarchy));
           XmlConfigurator.Configure(repo, new FileInfo("log4net.config"));
           Logger = LogManager.GetLogger(typeof(StartUpBase));
           services.AddSingleton(typeof(ILog), Logger);
       }
    
    }
    

    启动.cs

    public class Startup : StartUpBase
    {
        public Startup(IWebHostEnvironment env, IConfiguration configuration) : base(env, configuration)
        {
            
        }
    
        public void ConfigureServices(IServiceCollection services)
        {
            ConfigureServiceBase(services);
          
            ...
        }
    
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            ...
        }
    }
    

    程序.cs

      class ServiceTemplate
      {
          static void Main(string[] args)
          {
    
              BuildWebHost(args).Run();
    
          }
    
          public static IWebHost BuildWebHost(string[] args)
          {
              return WebHost.CreateDefaultBuilder(args)
               .UseStartup<Startup>()
               .Build();
          }
      }
    

    根控制器

    [ApiController]
     [Route("api/[controller]")]
     public class Root : Controller
     {
         public Root(ILogger<Root> Logger)
         {
             Logger.LogDebug("Hello DEBUG");
             Logger.LogInformation("Hello DEBUG");
             Logger.LogWarning("Hello DEBUG");
             Logger.LogError("Hello DEBUG");
         }
      }
    

    log4net

    <log4net debug="true">
      <root>
        <level value="ALL" />
        <appender-ref ref="Console" />
        <appender-ref ref="RollingFile" />
      </root>
      <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
        <file value="C:\Repository\ShareSoftware\Logs\ServiceTemplate.log" />
        <staticLogFileName value="true" />
        <appendToFile value="true" />
        <rollingStyle value="Composite" />
        <maxSizeRollBackups value="100" />
        <maximumFileSize value="5MB" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
        </layout>
      </appender>
      <appender name="Console" type="log4net.Appender.ConsoleAppender">
        <layout type="log4net.Layout.PatternLayout">
          <!-- Pattern to output the caller's file name and line number -->
          <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
        </layout>
      </appender>
    </log4net>
    
  • 它因什么异常而崩溃?您是在自己的帐户下运行还是这是一个 IIS 应用程序?如果是这样,该应用程序是否从您登录到的相同通用路径提供服务?

  • 它没有崩溃,应用程序运行良好。我的问题是 Log4Net 没有写入我的日志文件。在程序终端中,打印了日志,因此达到了 LogDebug 函数。我正在自己的帐户上运行它(Visual Studio Debug)。我的日志文件夹和我的应用程序都在 C:/Repository/ShareSoftware 中。

  • 谢谢,您的回答让我意识到了自己的错误。我在 StartUpBase 中创建了一个 ILog 类型的 Logger 实例(Log4Net)。但在我的控制器中,我绑定了一个 ILogger 类型的 Logger,它来自 Microsoft.Extensions.Logger。它不起作用 :) 谢谢

  • 我找到了原因。在我的 StartUpBase 中,我将 ILog 类型 (Log4Net) 的 Logger 实例绑定到 service.AddSingleton(...)。在我的 Controller 中,在构造函数中绑定了 ILogger (Microsoft.Extensions.Logging)。这是另一个 Logger 库,因此无法工作。经过这个小修复后,它就可以正常工作了:

       public Root(ILog Logger)
       {
           Logger.Debug("Hallo DEBUG");
           Logger.Info("Hallo DEBUG");
           Logger.Warn("Hallo DEBUG");
           Logger.Error("Hallo DEBUG");
       }
    
返回
作者最近主题: